回溯---含有相同元素求子集

本文介绍了一种使用回溯法求解含重复元素集合的不重复子集问题的方法。通过对输入数组进行排序并利用布尔数组跟踪已访问元素,避免了重复子集的生成。文章详细解释了算法思路,并提供了完整的Java代码实现。

含有相同元素求子集

90. Subsets II (Medium)

For example,
If nums = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]
题目描述:

  给定一个集合,集合中有重复元素,返回其所有的不重复子集。

思路分析:

  求集合的子集,用回溯法进行解决。由于有重复元素,那么我们先对集合进行排序,然后添加元素的时候,查看是否和前一个元素相同,如果相同并且前一个元素还没有被访问,那么就跳过。

代码:
class Solution {
    public List<List<Integer>>subsetsWithDup(int []nums){
    List<List<Integer>>res=new ArrayList<>();
    List<Integer>list=new ArrayList<>();
    if(nums==null||nums.length==0)
        return res;
    Arrays.sort(nums); //排序
    boolean []visited=new boolean[nums.length];
    for(int size=0;size<=nums.length;size++){
        backtracking(0,size,nums,visited,res,list);
    }
    return res;
}
public void backtracking(int start,int size,int[]nums,boolean[]visited,List<List<Integer>>res,List<Integer>list){
    if(list.size()==size){
        res.add(new ArrayList<>(list));
        return;
    }
    for(int i=start;i<nums.length;i++){
        if(i!=0&&nums[i]==nums[i-1]&&!visited[i-1])
            continue;
        list.add(nums[i]);
        visited[i]=true; //标记已经访问过
        backtracking(i+1,size,nums,visited,res,list);
        list.remove(list.size()-1);
        visited[i]=false;
    }
}
}

转载于:https://www.cnblogs.com/yjxyy/p/11114235.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值