zoukankan      html  css  js  c++  java
  • lettcode 90 子集II

    package com.example.lettcode.dailyexercises;
    
    import java.util.*;
    
    /**
     * @Class SubsetsWithDup
     * @Description 90 子集II 
     * 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
     * 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
     * <p>
     * 示例 1:
     * 输入:nums = [1,2,2]
     * 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
     * <p>
     * 示例 2:
     * 输入:nums = [0]
     * 输出:[[],[0]]
     * @Author
     * @Date 2021/3/31
     **/
    public class SubsetsWithDup {
        /**
         * 方法1:回溯算法
         * 和子集I不同的是,子集II可能出现重复的情况,所以需要去重
         * @param nums
         * @return
         */
        public static List<List<Integer>> subsetsWithDup(int[] nums) {
            if (nums == null || nums.length == 0) return new ArrayList<>();
            // 去重
            Set<List<Integer>> resSet = new HashSet<>();
            resSet.add(new ArrayList<>());
            for (int i = 0; i < nums.length; i++) {
                List<List<Integer>> listList = new ArrayList<>();
                for (List<Integer> integerList : resSet) {
                    // 不能直接在List上修改需要复制一份
                    List<Integer> integers = new ArrayList<>(integerList);
                    integers.add(nums[i]);
                    // 排序去重
                    Collections.sort(integers);
                    listList.add(integers);
                }
                resSet.addAll(listList);
            }
    
            List<List<Integer>> resList = new ArrayList<>();
            for (List<Integer> integers : resSet) {
                resList.add(integers);
            }
            return resList;
        }
    }
    
    // 测试用例
    public static void main(String[] args) {
    	int[] nums = new int[]{1, 2, 2};
    	List<List<Integer>> listList = subsetsWithDup(nums);
    	System.out.print("SubsetsWithDup demo01 result:[");
    	for (List<Integer> integerList : listList) {
    		System.out.print("[");
    		for (Integer integer : integerList) {
    			System.out.print("," + integer);
    		}
    		System.out.print("]");
    	}
    	System.out.println("]");
    
    	nums = new int[]{0};
    	listList = subsetsWithDup(nums);
    	System.out.print("SubsetsWithDup demo02 result:[");
    	for (List<Integer> integerList : listList) {
    		System.out.print("[");
    		for (Integer integer : integerList) {
    			System.out.print("," + integer);
    		}
    		System.out.print("]");
    	}
    	System.out.println("]");
    
    	nums = new int[]{4, 4, 4, 1, 4};
    	listList = subsetsWithDup(nums);
    	System.out.print("SubsetsWithDup demo03 result:[");
    	for (List<Integer> integerList : listList) {
    		System.out.print("[");
    		for (Integer integer : integerList) {
    			System.out.print("," + integer);
    		}
    		System.out.print("]");
    	}
    	System.out.println("]");
    }
    
  • 相关阅读:
    Fragment练习
    view有了父元素就不能再添加父元素
    margin与padding的不同
    BroadcastReceiver组件
    史上最著名的10个思想实验[转]

    godaddy域名空间购买波折
    碎片2
    程序员要多喝水
    google.com的首页换上了pc man游戏
  • 原文地址:https://www.cnblogs.com/fyusac/p/14600514.html
Copyright © 2011-2022 走看看