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

    题目描述:

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

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

      示例:

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

    题解:

    1、迭代法

    public class L90 {
        public static List<List<Integer>> subsetsWithDup(int[] nums) {
            Arrays.sort(nums);
            List<List<Integer>> lists = new ArrayList<>();
            /*维护一个列表,当当前元素与上一个元素相同的处理*/
            List<List<Integer>> listOld = new ArrayList<>();
            List<Integer> list = new ArrayList<>();
            lists.add(list);
            for(int index = 0;index <nums.length;index++){
                /*维护一个新的列表,用于添加新的元素*/
                List<List<Integer>> lists02 = new ArrayList<>();
                if(index >0 && nums[index] == nums[index-1]){
                    for(List<Integer> lis:listOld){
                        List<Integer> listNew = new ArrayList<>(lis);
                        lists02.add(listNew);
                    }
                }else {
                    for(List<Integer> lis:lists){
                        List<Integer> listNew = new ArrayList<>(lis);
                        lists02.add(listNew);
                    }
                }
                for(List<Integer> li:lists02){
                    li.add(nums[index]);
                }
                listOld = new ArrayList<>(lists02);
                lists02.forEach(lis->lists.add(lis));
            }
            return lists;
        }
        public static void main(String[] args) {
            int[] nums = {1,2,2};
            List<List<Integer>> listss = subsetsWithDup(nums);
    
        }

    2、回溯法

    public class L90_1 {
        public static List<List<Integer>> subsetsWithDup(int[] nums) {
            Arrays.sort(nums);
            List<List<Integer>> lists = new ArrayList<>();
            back_track(nums,lists,new Stack<Integer>(),0);
            return lists;
        }
        /*回溯法*/
        public static void back_track(int[] nums, List<List<Integer>> lists, Stack<Integer> list, Integer index){
            lists.add(new ArrayList<>(list));
            for(int ii = index;ii<nums.length;ii++){
                if(ii>index && nums[ii] == nums[ii-1]){continue;}
                list.push(nums[ii]);
                back_track(nums,lists,list,ii+1);
                list.pop();
            }
        }
        public static void main(String[] args) {
            int[] nums = {1,2,2};
            List<List<Integer>> listss = subsetsWithDup(nums);
    
        }
  • 相关阅读:
    bzoj3675 [Apio2014]序列分割
    bzoj3437 小P的牧场
    bzoj3156 防御准备
    bzoj1911 [Apio2010]特别行动队
    Codeforces 937.D Sleepy Game
    Codeforces 937.C Save Energy!
    Codeforces 937.B Vile Grasshoppers
    bzoj1597 [Usaco2008 Mar]土地购买
    DDA画线算法
    实验九
  • 原文地址:https://www.cnblogs.com/mayang2465/p/11941411.html
Copyright © 2011-2022 走看看