0%

47.全排列 II

题目

全排列 II

思路

对数组进行递归,若当前元素和上一次递归选择的元素相同,则直接跳过(相当于剪枝),若当前元素不等于上一次元素且没有被选择过,则可以选择,加入数组,直到临时数组的大小等于 nums 数组的大小,则将该临时数据加入至结果数组中。

题解

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
class Solution {
public:
vector<vector<int>> res;
vector<bool> used;

void dfs(vector<int>& nums, vector<int>& arr){
if(arr.size() == nums.size()){
res.push_back(arr);
}
int x = -11;
for(int i = 0; i < nums.size(); i++){
if(x == nums[i]) continue; // 当前位置刚选过的x和当前值相等。则直接跳过
if(!used[i]){ // 当前值没有被选择
used[i] = true;
arr.push_back(nums[i]);
dfs(nums, arr);
used[i] = false;
x = arr[arr.size() - 1];
arr.pop_back();
}
}
}

vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size(); i++) used.push_back(false);
vector<int> arr;
dfs(nums, arr);
return res;
}
};
  • 时间复杂度:O(n n!)*
  • 空间复杂度:O( n),结果数组中最多有 n 个元素的数组

执行用时:4 ms, 在所有 C++ 提交中击败了91.98%的用户

内存消耗:8.7 MB, 在所有 C++ 提交中击败了56.14%的用户

通过测试用例:33 / 33

正在加载今日诗词....