文章目录
更多LeetCode题解
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
Solution
此题和46题差不多,但区别在于给的数组是包含重复元素的,我的思路和46题也一样,使用递归,只不过在最后判断permutations数组里是否已经存在了一个一样的结果。算法是可行的,很遗憾,提交的时候TLE了,反思一下,是因为permutations数组的规模是
n
!
n!
n!级别的,搜索这样的一个数组花费的时间是
O
(
n
!
)
O(n!)
O(n!)。所以我转换了思路,将每一个位置已经使用过的元素保存在used_ele
里,如果某位置已经使用过某元素,那么下次想要在此位置添加相同元素进行递归搜索时,直接跳过(因为已经这种情况已经在前面搜索过了)。
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int> &nums) {
vector<vector<int>> permutation;
vector<int> used_ind;
vector<int> temp;
putElement(permutation, temp, nums, used_ind);
return permutation;
}
void putElement(vector<vector<int>> &permutation, vector<int> &res, vector<int> nums, vector<int> &used_ind) {
if (used_ind.size() < nums.size()) {
vector<int> used_ele;
for (int i = 0; i < nums.size(); i++) {
if (count(used_ind.begin(), used_ind.end(), i) || count(used_ele.begin(), used_ele.end(), nums[i])) {
continue;
} else {
res.push_back(nums[i]);
used_ind.push_back(i);
used_ele.push_back(nums[i]);
putElement(permutation, res, nums, used_ind);
}
}
if (res.size() == 0) return;
res.erase(res.end() - 1);
used_ind.erase(used_ind.end() - 1);
} else {
//if(!count(permutation.begin(), permutation.end(), res)){
permutation.push_back(res);
//}
res.erase(res.end() - 1);
used_ind.erase(used_ind.end() - 1);
}
}
};