Leetcode 90 子集 II

作者: itbird01 | 来源:发表于2021-12-14 20:19 被阅读0次

90. 子集 II

题意:给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列

解题思路

解法1:
1.很经典的回溯题型,给出的回溯算法模板:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

2.在注释中,可以发现可以不写终止条件,因为本来我们就要遍历整颗树。有的同学可能担心不写终止条件会不会无限递归?并不会,因为每次递归的下一层就是从i+1开始的。
3.认真审题,和上一题,明显的不同是,含有重复元素,也就说,子集很有可能重复
4.我们在每次加入ans之前,判断子集是否已出现过,使用hashmap实现数据检查

解题遇到的问题

后续需要总结学习的知识点

本题理解还不深刻,归根结底是对回溯算法不太了解,所以后续需要对回溯算法进行深入学习、总结

##解法1
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

class Solution {
    LinkedList<Integer> path = new LinkedList<Integer>();
    List<List<Integer>> ansList = new ArrayList<List<Integer>>();

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        dfs(0, nums);
        return ansList;
    }

    private void dfs(int i, int[] nums) {
        if (!isExist()) {
            ansList.add(new ArrayList<Integer>(path));
        }

        if (i >= nums.length) {
            return;
        }

        for (int j = i; j < nums.length; j++) {
            path.add(nums[j]);
            dfs(j + 1, nums);
            path.removeLast();
        }
    }

    private boolean isExist() {
        for (int j = 0; j < ansList.size(); j++) {
            List<Integer> list = ansList.get(j);
            if (list.size() == path.size()) {
                HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
                for (int i = 0; i < list.size(); i++) {
                    map.put(list.get(i), map.getOrDefault(list.get(i), 0) + 1);
                }

                for (int i = 0; i < path.size(); i++) {
                    if (map.containsKey(path.get(i))) {
                        if (map.get(path.get(i)) == 1) {
                            map.remove(path.get(i));
                        } else {
                            map.put(path.get(i), map.get(path.get(i)) - 1);
                        }
                    }
                }

                if (map.isEmpty()) {
                    return true;
                }
            }
        }
        return false;
    }
}

相关文章

  • Leetcode 90 子集 II

    90. 子集 II[https://leetcode-cn.com/problems/subsets-ii/] 题...

  • Leetcode 子集 II

    题目描述 leetcode 第90题:子集 II[https://leetcode-cn.com/problems...

  • 子集 II(LeetCode 90)

    题目https://www.jianshu.com/p/3150417100af升级版 给定一个可能包含重复元素的...

  • LeetCode - #90 子集 II

    前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swi...

  • LeetCode 力扣 90. 子集 II

    题目描述(中等难度) 78题升级版,大家可以先做 78 题。给定一个数组,输出所有它的子数组。区别在于,这道题给定...

  • 2019-05-24LeetCode90. 子集 II

    思考方法当然先排序,然后如果不重复那自然简单的把原先的子集扩充一倍,如果重复的话,由于地位和重复的数字一样,就只能...

  • python实现leetcode之90. 子集 II

    解题思路 遇事不决先排序 定义一个组合N选k的函数然后正对整个数组,从N选0,N选1,...N选k,一直到N选N然...

  • 90.子集II

    题目给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集...

  • 90.子集 II

    原题 https://leetcode-cn.com/problems/subsets-ii/ 解题思路 同 78...

  • 90. Subsets II/子集 II

    Given a collection of integers that might contain duplica...

网友评论

    本文标题:Leetcode 90 子集 II

    本文链接:https://www.haomeiwen.com/subject/fwhyfrtx.html