leetcode筆記——90子集Ⅱ
題目:
給定一個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: [1,2,2] 輸出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
思路:好長時間之後再來做題。。。還是先參考了網上大神的做法。原文連結:https://blog.csdn.net/xygy8860/article/details/47053633
以下的程式碼由一些深度優先搜尋的感覺,整體使用了遞迴的思路。
程式碼:
public class Solution {
List<List<Integer>> list;//結果集
List<Integer> al;//每一項
public List<List<Integer>> subsetsWithDup(int[] nums) {
list = new ArrayList<List<Integer>>();
al = new ArrayList<Integer>();
Arrays.sort(nums);
//排列組合
count(nums,al,0);
return list;
}
private void count(int[] nums,List<Integer> al,int j){
list.add(new ArrayList<Integer>(al));//不重複的才新增
for(int i = j; i < nums.length;i++){
if(i == j || nums[i] != nums[i-1]){//去除重複
al.add(nums[i]);//新增
count(nums,al,i+1);
al.remove(al.size()-1);//去除,為下一個結果做準備
}
}
}
}
執行最快的程式碼:
思路:有點看不懂
class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> res = new ArrayList<>(); Arrays.sort(nums); res.add(new ArrayList<>()); int last = nums[0], size = 1; for (int j = 0; j < nums.length; j++) { // 遍歷,把目前所擁有的所有子集都作為新子集,並在每個新子集中新增新元素 if (last != nums[j]) { last = nums[j]; size = res.size(); } int tempSize = res.size(); for (int i = tempSize- size; i < tempSize; i++) { res.add(new ArrayList<>(res.get(i))); res.get(res.size() - 1).add(nums[j]); } } return res; }