力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路:
与上一题区别是序列里有重复的数字。所以需要横向去重。
竖向传参去重,横向用函数内set去重

我的代码:
- class Solution {
- public:
- vector
int>> result; - vector<int> path;
-
- vector
int>> permuteUnique(vector<int>& nums) { - vector<bool> used(nums.size(), false);
- backtracking(nums, used);
- return result;
- }
- void backtracking(vector<int>& nums, vector<bool>& used)
- {
- if(path.size() == nums.size())
- {
- result.push_back(path);
- return;
- }
- std::unordered_set<int> uset;
- for(int i = 0; i < nums.size(); i++)
- {
- //这个跳过条件调了很长时间
- if(uset.find(nums[i]) != uset.end() || used[i] == true)
- {
- continue;
- }
- uset.insert(nums[i]);
- used[i] = true;
- path.push_back(nums[i]);
- backtracking(nums, used);
- path.pop_back();
- used[i] = false;//used需要回溯
- }
- }
- };
随想录代码:
- class Solution {
- private:
- vector
int>> result; - vector<int> path;
- void backtracking (vector<int>& nums, vector<bool>& used) {
- // 此时说明找到了一组
- if (path.size() == nums.size()) {
- result.push_back(path);
- return;
- }
- for (int i = 0; i < nums.size(); i++) {
- // used[i - 1] == true,说明同一树枝nums[i - 1]使用过
- // used[i - 1] == false,说明同一树层nums[i - 1]使用过
- // 如果同一树层nums[i - 1]使用过则直接跳过
- if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
- continue;
- }
- if (used[i] == false) {
- used[i] = true;
- path.push_back(nums[i]);
- backtracking(nums, used);
- path.pop_back();
- used[i] = false;
- }
- }
- }
- public:
- vector
int>> permuteUnique(vector<int>& nums) { - result.clear();
- path.clear();
- sort(nums.begin(), nums.end()); // 排序
- vector<bool> used(nums.size(), false);
- backtracking(nums, used);
- return result;
- }
- };