[leetcode]46.全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列
示例:

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

思路:dfs回溯

以样例中n=3时的递归搜索树:
[leetcode]46.全排列_第1张图片

状态变量:
1.depth,记录递归深度,递归边界为depth==len。
2.path,记录递归过程中所保存的节点,进入递归边界时存入ans数组。
3.used,用来回溯,标记数组中的元素是否已经被选择过,为false表示没有被选择过,加入temp,同时置为true,为true表示已经选择过,跳过,在dfs之后,将刚刚加入的元素弹出,同时置状态为false,表示回溯

AC代码:(C++)

class Solution {
   public:
    vector<int> temp;
    void dfs(vector<vector<int>>& ans, vector<int>& nums, vector<bool>& used,
             int depth, int len) {
        if (depth == len) {
            ans.push_back(temp);
            return;
        }
        for (int i = 0; i < len; i++) {
            if (used[i]) continue;  // used已经用过,跳过
            temp.push_back(nums[i]);
            used[i] = true;
            dfs(ans, nums, used, depth + 1, len);//回溯
            temp.pop_back();
            used[i] = false;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> ans;
        int len = nums.size();
        vector<bool> used(len, false);
        dfs(ans, nums, used, 0, len);
        return ans;
    }
};

你可能感兴趣的:(LeetCode)