leetcode第46题全排列
思路
典型的回溯问题。其实就是一道全排列问题,先确定第一个数字,再接着确定下面的数字
- 比如[1,2,3]先确定了1,然后继续确定下面的数字
- 这个时候已经选择过的数字就不能再选择了,所以要先检测当前加入的数字是否已经选择过
- 这个可以新增一个数组做哈希表来查询,加入数字的时候把哈希表的值置为1,删除的时候置为0,查询对应的数字对应的值即可
代码
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> permute(vector<int>& nums) {
vector<int> flag(1000000,0);
vector<int> temp;
dfs(nums,temp,flag);
return res;
}
void dfs(vector<int>& nums,vector<int>& temp,vector<int>& flag)
{
int n=nums.size();
//退出条件:达到n个数就退出
if(temp.size()==n)
{
res.push_back(temp);
return;
}
//列出从第一个数字到最后一个数字所有可能的情况
for(int i=0;i<n;i++)
{
//排除不合法的选择,有相同的数就删去
if(flag[i]==1)
continue;
//进行选择
//把当前的数字加入路径,找到当前数字可能的所有组合情况
temp.push_back(nums[i]);
flag[i]=1;
dfs(nums,temp,flag);
//撤回选择:加入的数字从路径种删除
temp.pop_back();
flag[i]=0;
}
}
};
算法分析
- 时间复杂度O(n^n)
- 空间复杂度O(n^n)
- 算法优缺点:时空复杂度都很高,但是是很简单的枚举,特别好写