LintCode 18-帶重複元素的子集 JAVA
阿新 • • 發佈:2019-01-31
本人電子系,只為一學生。心喜計算機,小編以怡情。
帶重複元素的子集
給定一個可能具有重複數字的列表,返回其所有可能的子集
注意事項
子集中的每個元素都是非降序的
兩個子集間的順序是無關緊要的
解集中不能包含重複子集
樣例
如果 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);
}
}
}
}