您的位置:首页 > 其它

18 - 带重复元素的子集

2017-09-14 17:42 459 查看
2017.9.14

写了一个新的函数 peekUnique(int[] nums,int k)。就是从一个数组中挑选k个数,有几种选择方案。

这样当求数组的子集的时候,就是k从1 到nums.length的peekUnique之和。

从n个数中选取k个数的公式为   f(n,k) = f(n-1,k)+f(n-1,k-1);

public class Solution {
/*
* @param nums: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
public static ArrayList<ArrayList<Integer>> peekUnique(int[] nums,int k){
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(nums == null || k > nums.length){
return res;
}
if(k == 1){
HashSet<Integer> set = new HashSet<Integer>();
for(int i = 0; i<nums.length;i++){
ArrayList<Integer> tmp = new ArrayList<Integer>();
if(!set.contains(nums[i])){
set.add(nums[i]);
tmp.add(nums[i]);
res.add(tmp);
}
}
}
else if(k == nums.length){
ArrayList<Integer> tmp = new ArrayList<Integer>();
for(int i = 0; i<nums.length;i++){
tmp.add(nums[i]);
}
res.add(tmp);
}
else{
int []newArr = Arrays.copyOf(nums, nums.length-1);
ArrayList<ArrayList<Integer>> tmp1 = peekUnique(newArr,k);
Iterator ite1 = tmp1.iterator();
HashSet<ArrayList<Integer>> set = new HashSet<ArrayList<Integer>>();
while(ite1.hasNext()){
ArrayList<Integer> tmp = (ArrayList<Integer>)ite1.next();
if(!set.contains(tmp)){
set.add(tmp);
res.add(tmp);
}
}

ArrayList<ArrayList<Integer>> tmp2 = peekUnique(newArr,k-1);
Iterator ite2 = tmp2.iterator();
while(ite2.hasNext()){
ArrayList<Integer> tmp = (ArrayList<Integer>)ite2.next();
tmp.add(nums[nums.length -1]);
if(!set.contains(tmp)){
set.add(tmp);
res.add(tmp);
}
}
}
return res;

}
public static List<List<Integer>> subsetsWithDup(int[] nums) {
// write your code here
List<List<Integer>> res = new ArrayList<>();
ArrayList<Integer> tmp = new ArrayList<Integer>();
res.add(tmp);
if(nums.length == 0){
return res;
}
Arrays.sort(nums);
for(int i = 1;i<=nums.length;i++){
ArrayList<ArrayList<Integer>> resTmp = peekUnique(nums,i);
res.addAll(resTmp);
}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: