力扣-47-全排列Ⅱ

好像相对于全排列唯一的不同就是包含了重复元素,这样的话会与原题有什么区别呢?
明明每次都选择了不同的元素,但是因为有元素相同,所以最终的结果却出现了重复值
然后因为这里是在意序列顺序、定长的,所以不能像之前做组合一样,直接从后面选、或者排序再从后面选什么的

这里用排序+交换?我尝试这么写了,但是很明显就出问题了,这俩不能同时用,因为交换会破坏原本的有序序列

用交换的本意是省去对于已经选择元素的标记

class Solution {
    vector<vector<int>> ans;

public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        perm(nums, 0, nums.size() - 1);
        return ans;
    }
    
    void perm(vector<int> nums, int left, int right) {
        if (left == right)
            ans.push_back(nums);
        else {
            for (int i = left; i <= right; i++) {
                if (i != left && nums[left] == nums[i]) continue;  # 去重
                swap(nums[left], nums[i]);
                perm(nums, left + 1, right);
            }
        }
    }
};

这是别人的答案,我看不明白
我甚至不确定这还是不是回溯

posted @ 2022-12-09 12:40  YaosGHC  阅读(22)  评论(0)    收藏  举报