46. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题
将遍历操作转化成树的叶子节点遍历,每一层的结点增加一个未遍历的数;
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
int n=nums.size();
vector<bool> visited(n,false);
dfs(nums,path,visited,n,0);
return result;
}
private:
vector<vector<int>> result;
vector<int> path;
void dfs(vector<int> & nums,vector<int> &path,vector<bool> &visited,int n,int cur)
{
if(cur==n)
{
result.push_back(path);
return;
}
for(int i=0;i<nums.size();i++)
{
if(!visited[i]){ //表示下标为i的数字已遍历
path.push_back(nums[i]);
visited[i]=true;
dfs(nums,path,visited,n,cur+1);
visited[i]=false;
path.pop_back();
}
}
}
};
注意点
visited数组标记下标为i的数已遍历,并非值为i的数已遍历(因为存在负数,下标无法为负数);
回溯算法:找到路径后需要撤销原先的操作(标记已遍历和加入path数组这两个操作);
解题2:next_permutation函数
用法:next_permutation(数组头地址,数组尾地址),将传入数组直接改写;
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
result.push_back(nums);
while(next_permutation(nums.begin(),nums.end()))
{
result.push_back(nums);
}
return result;
}
};