题目描述
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
题意:生成一个不包含重复元素的数组的全排列。
算法1
题解1:枚举每个位置当前放什么元素。vis
数组标记当前哪些元素被用过了,path
数组存储当前枚举的路径,cnt
代表当前枚举的元素个数。搜索时,依次将每一个没有访问过的元素加入path
,修改vis
标记,递归搜索,然后恢复现场(将这个元素弹出path
,恢复vis
标记)。
时间复杂度分析:$O(n*n!)$,总共n!
种情况,每种情况的长度为n
。
class Solution {
public:
vector<vector<int>> res;
int n ;
vector<vector<int>> permute(vector<int>& nums) {
n = nums.size();
vector<int> vis(n,0);
vector<int> path;
dfs(vis,nums,path,0);
return res;
}
void dfs(vector<int> &vis,vector<int>& nums,vector<int>& path,int cnt)
{
if(cnt == n) {res.push_back(path);return;}
for(int i = 0 ; i < n ; i ++)
{
if(vis[i] == 0)
{
path.push_back(nums[i]);
vis[i] = 1;
dfs(vis,nums,path,cnt + 1);
vis[i] = 0;
path.pop_back();
}
}
}
};
算法2
题解2:依次枚举每个位置放哪个元素!做法就是依次将当前位置元素和后面所有的元素交换。
class Solution {
public:
vector<vector<int>> res;
int n;
vector<vector<int>> permute(vector<int>& nums) {
n = nums.size();
if(n == 0) return res;
dfs(nums,0);
return res;
}
void dfs(vector<int>& nums,int cur)
{
if(cur == n) {res.push_back(nums);return;}
for(int i = cur; i < n ; i ++)
{
swap(nums[i],nums[cur]);
dfs(nums,cur + 1);
swap(nums[i],nums[cur]);
}
}
};
算法二没看懂,能详细一点吗