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
  • 相关阅读:
    按之字形数据打印二叉树
    对称的二叉树
    如何解决哈希冲突
    二叉树的下一节点
    删除链表中重复的节点
    链表的入环节点
    python入门
    js计算总页数
    将map中的值赋值给一个java对象
    给手机发送短信
  • 原文地址:https://www.cnblogs.com/cing/p/7881303.html
Copyright © 2011-2022 走看看