摘要:題目要求可以先參考關于的這篇博客再看接下來的內容。思路一鏈表的形式我們可以通過例子,,,來說明。在遞歸中我們會將起始下標后的值依次加入當前結果集,并將結果集加入結果集數組中。如果遇到重復的數字,則繼續遍歷下一個數字,直至遍歷結束。
題目要求
Given a collection of integers that might contain duplicates, nums, return all possible subsets. Note: The solution set must not contain duplicate subsets. For example, If nums = [1,2,2], a solution is: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
可以先參考關于SubsetI的這篇博客再看接下來的內容。
這里的區別在于假設輸入的數組存在重復值,則找到所有不重復的子集。
我們可以通過例子[1,2,2,3]來說明。當我們遇到重復值時,我們可以使用一個臨時數組將所有重復值的結果臨時保存起來,在這道題目中就是[[2],[2,2]],然后再將當前res中的結果和它一一組合成新的結果值,本例子中的當前res為[[ ],[1]],這樣合成之后就是[[],[2],[2,2],[1,2],[1,2,2]],從而避免產生重復的結果。
代碼如下:
public List思路二:遞歸> subsetsWithDup(int[] nums) { List
> result = new LinkedList
>(); result.add(new ArrayList
()); int length = nums.length; Arrays.sort(nums); for(int i = 0 ; i > temp = new LinkedList >(); for(List
tempResult : result){ List copyTemp = new ArrayList (tempResult); copyTemp.add(nums[i]); temp.add(copyTemp); } i++; while(i 0){ List currentTemp = temp.removeFirst(); result.add(currentTemp); List moreCurrentTemp = new ArrayList (currentTemp); moreCurrentTemp.add(nums[i]); temp.add(moreCurrentTemp); } } result.addAll(temp); } return result; }
其實對于遞歸,應當考慮從遞歸的輸入和輸出考慮。在這里我們將遞歸的輸入為當前的結果集,當前的數組,和遍歷的起始下標。在遞歸中我們會將起始下標后的值依次加入當前結果集,并將結果集加入結果集數組中。如果遇到重復的數字,則繼續遍歷下一個數字,直至遍歷結束。思路簡單清晰,效率也很高。
public List> subsetsWithDup2(int[] nums) { List
> fnl = new ArrayList
>(); Arrays.sort(nums); helper(fnl, new ArrayList
(), nums, 0); return fnl; } public void helper(List > fnl, List
temp, int[] nums, int start){ fnl.add(new ArrayList (temp)); for(int i =start; i start && nums[i]==nums[i-1]) continue; temp.add(nums[i]); helper(fnl, temp, nums, i+1 ); temp.remove(temp.size()-1); } }
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注我的微信公眾號!將會不定期的發放福利哦~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67356.html
摘要:題目描述注意題目解讀找出所有的子集。思路確定子集的來源,遍歷原始列表,每一個元素都往已有的子集列表里邊添加,同時添加到已有的子集中去,產生新的子集。類似于動態規劃思想,依賴于之前的東西產生現在的東西。 題目描述 Given a collection of integers that might contain duplicates, nums, return all possible ...
Subsets Problem Given a set of distinct integers, return all possible subsets. Notice Elements in a subset must be in non-descending order.The solution set must not contain duplicate subsets. Example ...
摘要:通用算法思路總結初始結果列表。可能要將數集排序,方便處理重復元素的情況。書寫遞歸函數,先要考慮原點狀況,一般就是考慮什么情況下要將當前結果添加到結果列表中。每當一個元素添加到當前結果中之后,要再調用遞歸函數,相當于固定了前綴窮舉后面的變化。 通用算法思路總結: 初始結果列表。 可能要將數集排序,方便處理重復元素的情況。 調用遞歸函數。 書寫遞歸函數,先要考慮原點狀況,一般就是考慮什么...
摘要:寫這個系列是因為紀念一下去年的今天,就是年的月號,刷題第一天,今天是一周年紀念日。排除,就是返回一空的。復雜度分析算法課講過,這個復雜度是指數次,能實現出來就行了,沒法優化。復雜度分析不分析了,反正指數次。 Subsets 寫這個系列是因為紀念一下去年的今天,就是2015年的9月14號,刷題第一天,今天是一周年紀念日。當時只敢做easy還得抄答案的我想啥時候能做上medium啊,事到如...
摘要:深度優先搜索復雜度時間空間遞歸棧空間思路這道題可以轉化為一個類似二叉樹的深度優先搜索。另外需要先排序以滿足題目要求。新的集合要一個新的,防止修改引用。 Subset I Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must be in n...
閱讀 2924·2021-11-17 09:33
閱讀 1645·2021-10-12 10:13
閱讀 2472·2021-09-22 15:48
閱讀 2347·2019-08-29 17:19
閱讀 2598·2019-08-26 11:50
閱讀 1574·2019-08-26 10:37
閱讀 1741·2019-08-23 16:54
閱讀 2928·2019-08-23 14:14