【LeetCode】Permutations(全排列)

版权声明:『无垢识·空之境界』 https://blog.csdn.net/ecysakura/article/details/88911130

这道题是LeetCode里的第46道题。

题目要求:

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

示例:

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

回溯法解题,函数的递归调用。

提交代码:

class Solution {
public:
    void getsol(vector<int>& nums, int a[], int k, vector<int>& sol, vector<vector<int>>& res) {
	    for (int i = 0; i < nums.size(); i++) {
		    if (a[i]) {
			    a[i] = 0;
			    sol.push_back(nums[i]);
			    getsol(nums, a, k + 1, sol, res);
			    sol.pop_back();
			    a[i] = 1;
		    }
		    if (k == nums.size()) {
                res.push_back(sol);
                return;
            }
	    }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>>res;
	    vector<int>sol;
	    int *a = new int[nums.size()];//这个数组用来记录该数组是否在sol中,避免重复
	    for (int i = 0; i < nums.size(); i++)a[i] = 1;
	    for (int i = 0; i < nums.size(); i++) {
		    a[i] = 0;
		    sol.push_back(nums[i]);
		    getsol(nums, a, 1, sol, res);
		    sol.pop_back();
		    a[i] = 1;
	    }
	    return res;
    }
};

提交结果:

个人总结:

回溯法的题目还是需要多多调试熟悉一下它的运行过程,堆栈的调用和转移。

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        if(nums.empty())return vector<vector<int>>(1,vector<int>());
        vector<vector<int>>res;
        int first=nums[0];
        nums.erase(nums.begin());
        vector<vector<int>>words=permute(nums);
        for(auto &a:words) {
            for(int i=0;i<=a.size();++i) {
                a.insert(a.begin()+i,first);
                res.push_back(a);
                a.erase(a.begin()+i);
            }
        }
        return res;
    }
};

像这种方法是在把从下一层返回的 res 赋予 words,然后使用 a 容器遍历 words,把 get 到的数 first 依次插入到容器 a 里在放入 res 中保存在把插入的 first 取出,然后在把所得的结果一步一步以 res 的形式返回给上一层。

猜你喜欢

转载自blog.csdn.net/ecysakura/article/details/88911130