1. 程式人生 > 其它 >力扣-47-全排列Ⅱ

力扣-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);
            }
        }
    }
};

這是別人的答案,我看不明白
我甚至不確定這還是不是回溯