1. 程式人生 > >LintCode 18-帶重複元素的子集 JAVA

LintCode 18-帶重複元素的子集 JAVA

本人電子系,只為一學生。心喜計算機,小編以怡情。

帶重複元素的子集

給定一個可能具有重複數字的列表,返回其所有可能的子集

注意事項
子集中的每個元素都是非降序的
兩個子集間的順序是無關緊要的
解集中不能包含重複子集
樣例
如果 S = [1,2,2],一個可能的答案為:

[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

思路:遞迴法
自己定義了位置引數currentposition
缺點:遞迴引數應該可以減少。。吧?

static public ArrayList<ArrayList<Integer>> subsetsWithDup(int
[] nums) { //定義了兩個List ArrayList<Integer> str=new ArrayList<>(); List<ArrayList<Integer>> ret=new ArrayList<>(); //獲取陣列長度 int n=nums.length; //新增[],我遞迴程式不考慮[],因此在這裡處理 ret.add(new ArrayList<Integer>()); //考慮特殊情況-空陣列
if(nums.length==0) return (ArrayList<ArrayList<Integer>>) ret; //對陣列排序,因為題目要求是升序 Arrays.sort(nums); //呼叫遞迴 //(第一層,共n層,返回ret,臨時ArrayList,0號位置開始) recursion(1,n,ret,str,nums,0); return (ArrayList<ArrayList<Integer>>) ret; } static
void recursion(int k,int n,List<ArrayList<Integer>> ret,ArrayList<Integer> str,int nums[],int currentposition) { if(k>n)//退出條件 return; else { for(int i=0;i<nums.length;i++) { int candidate=nums[i];//取一個候選解 if(i>currentposition||k==1)//滿足候選解在後面或者是第一層元素時 { str.add(candidate);//臨時ArrayList新增候選解 if(!ret.contains(str))//如果ret不包含 { ret.add(new ArrayList<>(str));//新增,注意這裡要new一個新的 } //遞迴 recursion(k+1, n, ret, str, nums,i); //撤銷候選解,進行其他的嘗試 str.remove(str.size()-1); } } } }