解題思路:
? ? ? ? 1.獲取信息:
? ? ? ? ? ? ? ? 給定一個可包含重復數字的序列,按任意順序返回所有不重復的全排列
? ? ? ? ? ? ? ? 提示信息:1 <= nums.length <= 8
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??-10 <= nums[i] <= 10
? ? ? ? ?2.分析題目:
? ? ? ? ? ? ? ? 相較于46題,它多限制了一個條件,也就是數組中可能出現重復的數字了
? ? ? ? ? ? ? ? 所以說它是46題的進階版
? ? ? ? ? ? ? ? 對于出現重復數字,我們可以將46題中的查重容器變換一下,改為存儲整型的數組,這樣就可以針對于某個數字記錄下它出現了幾次
? ? ? ? ? ? ? ? 不止是上面的變動,這道題因為數組中會出現重復的數字,所以重復率相較于46題變高了
? ? ? ? ? ? ? ? 那么重復率為什么會變高呢?
? ? ? ? ? ? ? ? 因為原本在某個位置取了一個數,在走它其他的支線時,因為會出現重復的數,就會再次取到相同的數,那么后續的支線也就相同了,我給個例子解釋
? ? ? ? ? ? ? ? 例如[ 1, 1, 2 ]
? ? ? ? ? ? ? ? 我們遍歷數組取出每個數作為每種排列的第一個數
? ? ? ? ? ? ? ? 那么第一個位置上就會出現兩次1,后續再取第二個數,第三個數,那這兩次都是相同的
? ? ? ? ? ? ? ? 所以就需要再次添加一個查重的操作
? ? ? ? 3.示例查驗:略
? ? ? ? 4.嘗試編寫代碼:
? ? ? ? ? ? ? ? (1)暴力法:
? ? ? ? ? ? ? ? ? ? ? ? 思路:與46題的思想基本一致,只不過多加了一次查重的操作,并且將原有的查重操作進階了一下,具體看代碼吧
? ? ? ? ? ? ? ? ? ? ? ? 你可以結合46題的代碼來看,我究竟新添加了哪些步驟,可以幫助你更好地理解
class Solution {
public:vector<vector<int>> permuteUnique(vector<int>& nums) {vector<vector<int>>res;vector<int>tab(21,0);//原有的查重操作進階版for(int i=0;i<nums.size();i++)tab[nums[i]+10]++;vector<int>path;GetRes(res,tab,path,nums);return res;}
private:void GetRes(vector<vector<int>>&res,vector<int>&tab,vector<int>&path,vector<int>&nums){if(path.size()==nums.size()){res.push_back(path);return;}vector<bool>In(21,true);//新添加的查重操作for(int i=0;i<nums.size();i++){if(In[nums[i]+10]&&tab[nums[i]+10]){In[nums[i]+10]=false;tab[nums[i]+10]--;path.push_back(nums[i]);GetRes(res,tab,path,nums);path.pop_back();tab[nums[i]+10]++;}}}
};
今天的題解就到這里了,四川真的好熱,看著外面的太陽,我就感覺好害怕,閑來沒事就把今天的題解解決了,大大的進步
現在要玩一下英雄聯盟了,獎勵一下自己