LeetCode 47——全排列 II

1. 題目

2. 解答

LeetCode 46——全排列 中咱們已經知道,全排列其實就是先肯定某一個位置的元素,而後餘下就是一個子問題。在那個問題中,數據沒有重複,因此數據中的任意元素均可以放在最後一個位置。數組

可是,若是數據有重複的話,重複的數據都放在最後則是同樣的結果,咱們須要進行一個去重。在這裏,咱們對數據先進行一個排序,而後依次把每一個數據都交換到第一個位置,若是它和第一個數據不相等的話,並且咱們不用再交換回來,最後遞歸求解子問題便可。code

好比數據 [1, 3, 3, 4],第一次交換爲 [1, 3, 3, 4],1 爲第一個元素;第二次交換爲 [3, 1, 3, 4],3 爲第一個元素;第三次交換時 3 和 3 相等,重複狀況不交換;第四次交換爲 [4, 1, 3, 3],4 爲第一個元素。能夠看到,這樣的話第一個元素總共有三種狀況,而後分別遞歸便可。blog

class Solution {

    vector<vector<int>> result;

public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        
        int n = nums.size();
        sort(nums.begin(), nums.end());
        Generate_Premutations(nums, 0, n-1);
        return result;       
    }
    
    void Generate_Premutations(vector<int> nums, int left, int right)
    {
        if (left == right)
        {
            result.push_back(nums);
        }
        else
        {
            for (int i = left; i <= right; i++)
            {
                if (i != left && nums[i] == nums[left])   continue; 
                // 交換後就再也不交換回來了,需傳值而不是傳引用,不然遞歸調用就會改變數組
                swap(nums[left], nums[i]);
                Generate_Premutations(nums, left+1, right);          
            }
        }
    }
};

獲取更多精彩,請關注「seniusen」!排序

相關文章
相關標籤/搜索