题目:
给定一个不含重复数字的数组 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 中的所有整数 互不相同
代码:
整体来说还是比较简单,这里有个小技巧,使用递归解决问题时,由于系统会把当前函数中的各种变量压入栈中,那么就意味着,如果递归大量次数,那么任何一种变量都会被大量存储。
面对这种情况,我们应该尽可能把参数变量用作引用形式。因为引用形式就是使用地址访问,这种情况下不会复制新建一个值相等的变量,而是始终使用一个变量。
当然什么情况下可以改成引用,什么情况下不能,就需要依据实际情况下而定了。如果某个数组或者矩阵从来都不会被修改,那大可以使用引用的形式。如果需要修改,那就得谨慎。
class Solution {
public:
vector<int> temp;
bool final(vector<bool> &flag)
{
int length=flag.size();
for(int i=0;i<length;i++)
{
if(flag[i]==false)
{
return false;
}
}
return true;
}
void consequence(vector<vector<int>> &ans,vector<int> &nums,vector<bool> &flag)
{
int len=flag.size();
if(final(flag))
{
ans.push_back(temp);
}
for(int i=0;i<len;i++)
{
if(flag[i]==false)
{
temp.push_back(nums[i]);
flag[i]=true;
consequence(ans,nums,flag);
temp.pop_back();
flag[i]=false;
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
int n=nums.size();
vector<vector<int>> ans;
vector<bool> flag(n,false);
consequence(ans,nums,flag);
return ans;
}
};