在 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」!排序