题目:带重复元素的子集


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

您在真实的面试中是否遇到过这个题?

Yes





样例

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

注意

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


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

解集中不能包含重复子集
标签 Expand   



相关题目 Expand

解题思路: 
DFS+递归 实现
数组中的每一个数字都可以选择要或者不要。比如{1,2,3}.1 可以选择要或者不要,2,3也一样。
在加入时候,需要判断是否重复
class Solution {
    /**
     * @param S: A set of numbers.
     * @return: A list of lists. All valid subsets.
     */
    public ArrayList<ArrayList<Integer>> subsetsWithDup(ArrayList<Integer> S) {
        // write your code here
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
          ArrayList<Integer> tmp = new ArrayList<>();
          Collections.sort(S);
          subsetWithDup(res, tmp, S, 0);
          return res;
     }
    @SuppressWarnings("unchecked")
     public void subsetWithDup(ArrayList<ArrayList<Integer>> res,
               ArrayList<Integer> tmp, ArrayList<Integer> S, int n) {
          if (S.size() == n) {
               boolean flag = false; // res中是否存在tmp值的arraylist.
               for (int i = 0; i < res.size(); i++) {
                    if (res.get(i).equals(tmp)) {
                         flag = true;
                         break;
                    }
               }
               if (!flag) {
                    res.add((ArrayList<Integer>) tmp.clone());
               }
               return;
          }
         
          //不要这个数字
          subsetWithDup(res, tmp, S, n+1);
          //要这个数字
          tmp.add(S.get(n));
          subsetWithDup(res, tmp, S, n+1);
          tmp.remove(tmp.size()-1);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值