491.遞增子序列
思路:
這道題不能進行排序翻默,否則會將后面的相同的數(shù)放到前面導致增加了數(shù)組。不排序但使用之前的去重沒法去除非連續(xù)的集合恰起。使用最大值記錄i修械,跳過比最大值小的會漏掉后面的startIndex,樹枝去重過度检盼; 記錄startIndex會導致數(shù)層難以去重
看視頻后:
1. 本題是樹枝不去重肯污,樹層去重。不像之前排序后使用vector<bool>記錄相鄰元素使用情況,本題使用哈希表中的unordered_set或數(shù)組(根據(jù)題目給的數(shù)值范圍)進行記錄元素是否出現(xiàn)過蹦渣。
本題set不用回溯是因為它僅在本層使用哄芜,每一層會新開一個set,只需要知道本層是否使用過這個元素
2. 在path不為空的情況下柬唯,下一個元素要比已經(jīng)進入path的元素大
unordered_set<int>?pathset;
????????for(int?i=startIndex;i<nums.size();i++)
????????{
????????????if(!path.empty()?&&?nums[i]<path.back())
????????????????continue;?
????????????if?(pathset.find(nums[i])!=pathset.end())
????????????????continue;
????????????path.push_back(nums[i]);
????????????pathset.insert(nums[i]);
????????????backTracking(nums,i+1);
????????????path.pop_back();
????????}
3. 只有path.size()>1的path才需要收進result中认臊。
新的去重方法!
46.全排列
思路:
排列和組合的區(qū)別在于順序是否影響锄奢。排列的元素順序也要考慮在內失晴,因此不需要i+1,每一次都要遍歷過全部元素斟薇。但是之前使用過的元素不能再使用师坎,樹層和樹枝都是,因此需要傳入一個哈希表堪滨,判斷元素是否使用胯陋。本題因為元素在-10到10的范圍內,只需建立一個size=21的數(shù)組記錄即可袱箱。使用過為1遏乔,沒使用過為0。如果為1則跳過本輪发笔。
看視頻后:
傳入一個哈希表在整體上看是否使用過盟萨。
47.全排列 II
思路:
在上一題的思路上加上把數(shù)組排序,并增加一個vector(bool) 判斷在本層內該元素是否與前一元素相同了讨,如果相同則continue捻激。即加上樹層去重。
看視頻后:
排序后只需要一個vector(bool)就可以達到樹層去重前计,加上if(used[i]==true) continue;進行樹枝上的去重