您的位置:首页 > 编程语言 > Java开发

LintCode 18-带重复元素的子集 JAVA

2017-02-02 16:00 471 查看

本人电子系,只为一学生。心喜计算机,小编以怡情。

带重复元素的子集

给定一个可能具有重复数字的列表,返回其所有可能的子集

注意事项

子集中的每个元素都是非降序的

两个子集间的顺序是无关紧要的

解集中不能包含重复子集

样例

如果 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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java LintCode 递归