• 子集Ⅱ


    Leetcode题目描述

    给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

    说明:解集不能包含重复的子集。

    示例:

    输入: [1,2,2]
    输出:
    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/subsets-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    回溯算法 + Hash

    • 本人修改之后的方案,全部遍历,遍历过程中利用hash对每一次的值进行依次hash判断后再加载进入tmp值
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
    
        HashMap<List<Integer>, Integer> hashMap = new HashMap<List<Integer>, Integer>();
        public List<List<Integer>> subsetsWithDup(int[] nums) {
            List<List<Integer>> res = new ArrayList<>();
            Arrays.sort(nums);
            backtrack(0, nums, new ArrayList<Integer>(), res);
            return res;
        }
    
        /**
         *
         * @param start 第一次开始的计算地方
         * @param nums 原数组
         * @param tmp   一次结果
         * @param res   总结果
         */
        public void backtrack(int start, int[] nums, List<Integer> tmp, List<List<Integer>> res){
            // 不需要判断是否到达数组底部,通过hash直接判断是否已经存在解决方案了
            if(!hashMap.containsKey(tmp)){
                hashMap.put(tmp, 1);
                res.add(new ArrayList<>(tmp));
            }
    
            for(int j = start; j < nums.length; j++){
                tmp.add(nums[j]);
                backtrack(j + 1, nums, tmp, res);
                tmp.remove(tmp.size() - 1);
            }
    
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)
    
    

    回溯算法(不使用hash)

    • 这是别人的优化代码,直接通过跳过位置不同而数值相同的数字进入下一次循环计算
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        Arrays.sort(nums); //排序
        getAns(nums, 0, new ArrayList<>(), ans);
        return ans;
    }
    
    private void getAns(int[] nums, int start, ArrayList<Integer> temp, List<List<Integer>> ans) {
        ans.add(new ArrayList<>(temp));
        for (int i = start; i < nums.length; i++) {
            //和上个数字相等就跳过
            if (i > start && nums[i] == nums[i - 1]) {
                continue;
            }
            temp.add(nums[i]);
            getAns(nums, i + 1, temp, ans);
            temp.remove(temp.size() - 1);
        }
    }
    
    作者:windliang
    链接:https://leetcode-cn.com/problems/subsets-ii/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-19/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
  • 相关阅读:
    Html禁止粘贴 复制 剪切
    表单标签
    自构BeanHandler(用BeansUtils)
    spring配置中引入properties
    How Subcontracting Cockpit ME2ON creates SD delivery?
    cascadia code一款很好看的微软字体
    How condition value calculated in sap
    Code in SAP query
    SO Pricing not updated for partial billing items
    Javascript learning
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13784966.html
Copyright © 2020-2023  润新知