[LeetCode]90. 子集 II(java实现)dfs

[LeetCode]90. 子集 II(java实现)dfs

  • 1. 题目
  • 2. 读题(需要重点注意的东西)
  • 3. 解法
  • 4. 可能有帮助的前置习题
  • 5. 所用到的数据结构与算法思想
  • 6. 总结

1. 题目

[LeetCode]90. 子集 II(java实现)dfs_第1张图片
[LeetCode]90. 子集 II(java实现)dfs_第2张图片

2. 读题(需要重点注意的东西)

思路:
在[LeetCode]78. 子集(java实现)dfs的基础上,本题新增了元素可能相同的条件。
解法如下:

  1. 将数组进行排序,将相同的元素放在一起
  2. dfs,先判断不选的情况,再判断选的情况,当选择这个数时,如果当前元素和上一个元素相同,如果上一个元素没有选的话,那么当前这个元素也不能选,这样就确保了相同元素的相对位置关系是一致的,不会出现重复

3. 解法

---------------------------------------------------解法---------------------------------------------------

class Solution {
    List<List<Integer>> list = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        boolean[] st = new boolean[nums.length];
        dfs(nums,0,st);
        return list;
    }

    public void dfs(int[] nums,int u,boolean[] st){
        if(u == nums.length){
            list.add(new ArrayList<Integer>(path));
            return;
        }
        
        // 不选
        dfs(nums,u+1,st);

        // 选
        // 如果当前元素和上一个元素相同,且上一个元素没有选的话,那么当前这个元素也不能选
        if(u > 0 && nums[u] == nums[u - 1] && !st[u - 1]) return;
        st[u] = true;
        path.add(nums[u]);
        dfs(nums,u + 1,st);
        path.remove(path.size() - 1);
        st[u] = false;
    }
}

可能存在的问题:

4. 可能有帮助的前置习题

  • [AcWing]842. 排列数字(C++实现)dfs模板题,递归思想的解释
  • [LeetCode]78. 子集(java实现)dfs

5. 所用到的数据结构与算法思想

  • Java数据结构—List(链表、顺序表的定义及其基本操作)

6. 总结

你可能感兴趣的:(LeetCode深度解析,java,leetcode,算法)