带重复元素的子集

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

注意事项
  • 子集中的每个元素都是非降序的
  • 两个子集间的顺序是无关紧要的
  • 解集中不能包含重复子集

样例

如果 S = [1,2,2],一个可能的答案为:

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

思路:

第一种做法,递归加回溯。同一层中只要不选相同的数字,那么就不会出现重复的情况。(看似很有道理,可是证明它的正确性貌似没有这么容易,如何想到这种策略的呢?)

第二种做法,二进制加速(厉害了),利用hashset中不能包含相同的元素的特点,HashSet<arraylist> ans ,这样的结构为最后结果。
5个数字就有2的5次方种子集(不考虑重复),每一种情况就是一个数字,这个数字二进制表示的时候,有1的位要,为0的位不要。

第一种做法略

第二种做法:

import java.util.*;
class Solution {
    /**
     * @param S: A set of numbers.
     * @return: A list of lists. All valid subsets.
     */
    public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
        // write your code here
        Arrays.sort(S);
        HashSet<ArrayList<Integer>> ans=new HashSet<ArrayList<Integer>>();
        int len=S.length;
        for(int i=0;i<Math.pow(2,len);i++){
            ArrayList<Integer> temp=new ArrayList<Integer>();
            int tem=i;
            for(int j=0;j<len;j++){
                int tempint=tem&1;
                if(tempint==1){
                    temp.add(S[j]);
                }
                tem>>=1;
            }
            ans.add(temp);
        }
        return new ArrayList<ArrayList<Integer>>(ans);
    }
}
时间: 2024-12-18 01:49:43

带重复元素的子集的相关文章

lintcode 中等题:subsets II 带重复元素的子集

题目 带重复元素的子集 给定一个可能具有重复数字的列表,返回其所有可能的子集 样例 如果 S = [1,2,2],一个可能的答案为: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 注意 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 挑战 你可以同时用递归与非递归的方式解决么? 解题 一个很简单的想法就是在上一题目中增加判断是否已经存在某个子集 class Solution: """ @param S: A

lintcode:子集 &amp; 带重复元素的子集

地址: http://lintcode.com/zh-cn/problem/subsets/ http://lintcode.com/zh-cn/problem/subsets-ii/ 子集 其实就是一颗子集树 class Solution { public: vector<vector<int>> res; vector<int> judge; int len; /* * @param nums: A set of numbers * @return: A list

九章算法面试题54 带重复元素的全排列

九章算法官网-原文网址 http://www.jiuzhang.com/problem/54/ 题目 给定一个带重复元素的整数集合,求出这个集合中所有元素的全排列.对于集合[1,1,2],其本质不同的全排列有三个,分别为: [1,1,2] [1,2,1] [2,1,1] 在线测试本题 http://lintcode.com/problem/unique-permutations/ 解答 首先做这个题目之前,要先会不带重复元素的全排列. 程序参考:http://www.ninechapter.co

[LintCode] 带重复元素的排列

递归实现: 1 class Solution { 2 public: 3 /** 4 * @param nums: A list of integers. 5 * @return: A list of unique permutations. 6 */ 7 vector<vector<int> > permuteUnique(vector<int> &nums) { 8 // write your code here 9 sort(nums.begin(), n

从n个元素中选择k个的所有组合(包含重复元素)

LeetCode:Combinations这篇博客中给出了不包含重复元素求组合的5种解法.我们在这些解法的基础上修改以支持包含重复元素的情况.对于这种情况,首先肯定要对数组排序,以下不再强调 修改算法1:按照求包含重复元素集合子集的方法LeetCode:Subsets II算法1的解释,我们知道:若当前处理的元素如果在前面出现过m次,那么只有当前组合中包含m个该元素时,才把当前元素加入组合 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

[LeetCode系列]子集枚举问题[有重复元素]

给定一组数(未排序, 可能有重复元素), 求出所有可能的组合. 算法和无重复元素的相似. 唯一需要注意的是, 如果当前的数字和之前的相同, 算法就只会在结尾数字是此数字的组合后加上此数字. 比如现在是[[] [1] [1 2] [2]], 当前数字是2, 就只会增加[1 2 2] [2 2] 代码: 1 class Solution { 2 public: 3 vector<vector<int> > subsetsWithDup(vector<int> &S)

可查找重复元素的二分查找算法

可查找重复元素的二分查找算法 二分查找算法思想:又称为 折半查找,二分查找适合对已经排序好的数据集合进行查找.假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,如果等于key则返回:如果大于关键字key,则在前一个数据集合中查找:否则在后一个子集中查找,直到找到为止:如果没找到则返回-1. 思路: 1.先定义两个下标 , left = 0 , right = arr.length -1; 2.因为我们也不知道要循环多少次,定义一

带重复的全排列问题

明白带重复的全排列首先要明白不带重复的全排列(不带重复的全排列链接) 在不带重复的全排列中说到在排列1,2,3,4插入5有5种方式,会生成5种新的排列. 如果我们在1,1,2,3中插如4也有五种方式, (1)4,1,1,2,3 (2)1,4,1,2,3 (3)1,1,4,2,3 (4)1,1,2,4,3 (5)1,1,2,3,4 生成了五种排列 但如果在1,2,3,4中插如1 (1)1,1,2,3,4 (2)1,1,2,3,4 (3)1,2,1,3,4 (4)1,2,3,1,4 (5)1,2,3

请写一个算法,用于将list集合内重复元素剔除

package Homework; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Scanner;/** * list集合是否可以包含重复元素? * 如果可以,请写一个算法,用于将list集合内重复元素剔除. * @author 张致远 * */public class Homework2 { public static void main(String[]