LeetCode-46-全排列

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

示例:

1
2
3
4
5
6
7
8
9
10
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//有两种思路:
//1.每个位置可以放的数
//2.枚举当前数可放哪些位置
//实践复杂度O(N^2)
//空间复杂度O(N)
class Solution {
private:
vector<vector<int>> res;
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<int> cs;

int length = nums.size();
if (length==0|| length==1) {
res.push_back(nums);
return res;
}
//访问标记位,解决每次从数组中复制新数组,复杂度保持不变
int *visited = new int[length];
for (int i = 0;i < length;i++)
visited[i] = 0;

DFS(nums, nums.size(), cs, visited);
return res;
}

void DFS(vector<int>& nums,int length,vector<int>& cs,int* visited){
if (length == 0) {
res.push_back(cs);
return;
}

for (int i = 0;i < nums.size();i++) {
//迭代过程中查看是否以访问
if (!visited[i]) {
cs.push_back(nums[i]);
visited[i] = 1;
//继续递归
DFS(nums, length - 1, cs, visited);
//注意清空之前操作的数,避免对同层造成影响
visited[i] = 0;
cs.pop_back();
}
}

}
};

----\(˙<>˙)/----赞赏一下吧~