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;
}
}
写了一个新的函数 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;
}
}
相关文章推荐
- lintcode-带重复元素的子集-18
- LintCode 18 带重复元素的子集
- LintCode 18. 带重复元素的子集
- lintcode-18-带重复元素的子集
- LintCode 18-带重复元素的子集 JAVA
- Subsets II 求有重复元素的集合的子集 @LeetCode
- LintCode笔记(11)—— 带重复元素的子集
- 带重复元素的子集
- lintcode 中等题:subsets II 带重复元素的子集
- 子集生成之增量构造法(允许有重复元素)
- 集合论32元素以内划分为三个以下的子集(c实现版),没有重复了
- 带重复元素的子集
- 不包含重复元素的集合S,求其所有子集
- (lintcode)第18题 带重复元素的子集
- 题目:带重复元素的子集
- 带重复元素的子集
- 集合的子集生成(无重复元素)
- Java实现-带重复元素的子集
- 二进制法枚举无重复元素子集
- 18 如何从一个数组中移除重复的元素