zoukankan      html  css  js  c++  java
  • 90.Subsets II

    题目链接:https://leetcode.com/problems/subsets-ii/description/

    题目大意:与78题一样,只是这里给出的数组中有重复数字。

    法一(借鉴):利用78题的法一,进行与47题类似的剪枝去重操作。也就是排序,判断前一个元素等。代码如下(耗时4ms):

     1     public List<List<Integer>> subsetsWithDup(int[] nums) {
     2         List<List<Integer>> list = new ArrayList<List<Integer>>();
     3         List<Integer> tmp = new ArrayList<Integer>();
     4         Arrays.sort(nums);
     5         dfs(list, tmp, nums, 0);
     6         return list;
     7     }
     8     public static void dfs(List<List<Integer>> list, List<Integer> tmp, int[] nums, int start) {
     9         list.add(new ArrayList<Integer>(tmp));
    10         for(int i = start; i < nums.length; i++) {
    11             //剪枝,这里i!=start还没怎么看懂,但是不能使用i>0的判断
    12             if(i != start && nums[i] == nums[i - 1]) {
    13                 continue;
    14             }
    15             tmp.add(nums[i]);
    16             dfs(list, tmp, nums, i + 1);
    17             tmp.remove(tmp.size() - 1);
    18             
    19         }
    20     }
    View Code

    法二:并没有剪枝,而是在计算完所有的集合后,与结果集进行判断,如果结果集中没有,则加入结果集,否则跳过。代码如下(耗时61ms):

     1     public List<List<Integer>> subsetsWithDup(int[] nums) {
     2         List<List<Integer>> list = new ArrayList<List<Integer>>();
     3         List<Integer> tmp = new ArrayList<Integer>();
     4         Arrays.sort(nums);
     5         dfs(list, tmp, nums, 0);
     6         return list;
     7     }
     8     public static void dfs(List<List<Integer>> list, List<Integer> tmp, int[] nums, int start) {
     9         if(!list.contains(tmp)) {//与结果集进行判断
    10             list.add(new ArrayList<Integer>(tmp));
    11         }
    12         for(int i = start; i < nums.length; i++) {
    13             tmp.add(nums[i]);
    14             dfs(list, tmp, nums, i + 1);
    15             tmp.remove(tmp.size() - 1);
    16         }
    17     }
    View Code
  • 相关阅读:
    HTML超链接标签—链接QQ在线聊天
    超链接标签-QQ邮箱链接经验分享
    数据类型转换的事项和注释
    关键字、标识符、常量、变量的(定义)
    WendosiDOS命令的一些使用命令
    Map集合
    Set集合 HashSet集合 LInkHathSet集合
    增强for循环
    22_迭代器
    包装类
  • 原文地址:https://www.cnblogs.com/cing/p/7881303.html
Copyright © 2011-2022 走看看