zoukankan      html  css  js  c++  java
  • 子集Ⅱ

    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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
  • 相关阅读:
    sns矩阵
    家庭博客
    媒体治国
    论坛有
    模型指向同一地址,结构体指向不同地址
    苹果开发者公司账号添加个人开发者 加入不了开发者团队
    SourceTree下载 及使用
    关于swift语言中导入OC三方类找不到头文件的解决方法
    iPhone iPad 各种控件默认高度
    iOS 基于MVC设计模式的基类设计
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13784966.html
Copyright © 2011-2022 走看看