46. Permutations

Kesa...大约 1 分钟algorithm

46. 全排列open in new window

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

1. 回溯法

使用回溯法, 对于位置i的字符, 需要从[i, n-1]中的字符选择一个放入位置i, 当所有位置的字符确定后就的到一个解, 此时再回溯, 去寻找其他解.

func permute(nums []int) [][]int {
    res := [][]int{}
    helper(nums, 0, &res)
    return res
}

func helper(nums []int, idx int, res *[][]int) {
    // 解
    if idx == len(nums){
        tmp := make([]int, len(nums))
        copy(tmp, nums)
        *res = append(*res, tmp)
        return 
    }

    // 从剩下的字符中选取, 包含自己
    for j := idx; j < len(nums); j++ {
        // 选择一个字符, 进入下一步
        swap(nums, idx, j)
        helper(nums, idx+1, res)
        
        // 回溯
        swap(nums, idx, j)
    }
}

func swap(nums []int, i, j int) {
    if i != j {
        nums[i], nums[j] = nums[j], nums[i]
    }
}

Reference

  1. https://leetcode.cn/problems/permutations/solutionsopen in new window
上次编辑于:
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.2