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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

写好一个交换

然后开始谈思路,就是n从0开始递增,算第n个位置存的数,确定好之后存num进结果v

之后再swap原路恢复,进入下一种情况。

进行回溯

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> v;
        back(nums,v,0);
        return v;
    }
    void swap(int &a,int &b){
        int t=a;
        a=b;
        b=t;
    }
    void back(vector<int>& nums ,vector<vector<int>>& v,int  n){
        if(n==nums.size())v.push_back(nums);
        for(int i=n;i<nums.size();i++){
            swap(nums[i],nums[n]);
            back(nums,v,n+1);
            swap(nums[i],nums[n]);
        }
    }
};

LeetCode排名第一的代码

使用了栈和状态存储的bool值

 

class Solution {
public:
	vector<vector<int>> permute(vector<int>& nums) {
		vector<vector<int>> ret;
		int len = nums.size();
		if (len == 0) {
			return ret;
		}
		bool visit[len] = {false};
		stack<int> s;
		dev(len, 0, ret, nums, visit, s);
		return ret;
	}

	void dev(int len, int current, vector<vector<int>>& ret, vector<int>& nums, bool *visit, stack<int> &s) {
		vector<int> temp;
		if (current == len) {
			int* end = &s.top() + 1;
			int* begin = end - s.size();
			vector<int> temp(begin, end);
			ret.push_back(temp);
            return;
		}
		for (int i = 0; i < len; i++) {
			if (!visit[i]) {
				s.push(nums[i]);
				visit[i] = true;
				dev(len, current + 1, ret, nums, visit, s);
				s.pop();
				visit[i] = false;
			}
		}
	}
};