zoukankan      html  css  js  c++  java
  • Subsets II

    Given a collection of integers that might contain duplicates, S, return all possible subsets.

    Note:

    • Elements in a subset must be in non-descending order.
    • The solution set must not contain duplicate subsets.

    For example,
    If S = [1,2,2], a solution is:

    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]
    和subsets 算法一致,不过在加入到result前 先判定是否在hashmap中。
     1 public class Solution {
     2     public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
     3         // IMPORTANT: Please reset any member data you declared, as
     4         // the same Solution instance will be reused for each test case.
     5         Arrays.sort(S);
     6         HashMap<ArrayList<Integer>, Integer> hm = new HashMap<ArrayList<Integer>, Integer>();
     7         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
     8         for(int i = 0; i < (1 << S.length); i ++){
     9             ArrayList<Integer> row = new ArrayList<Integer>();
    10             for(int j = 0; j < S.length; j ++){
    11                 if((i & (1 << j)) != 0) row.add(S[j]);
    12             }
    13             if(!hm.containsKey(row)){
    14                 hm.put(row, 1);
    15                 result.add(row);
    16             }
    17         }
    18         return result;
    19     }
    20 }

     第三遍:

    使用recursive 做:

     1 public class Solution {
     2     ArrayList<List<Integer>> result = null;
     3     public List<List<Integer>> subsetsWithDup(int[] num) {
     4         result = new ArrayList<List<Integer>> ();
     5         if(num == null || num.length == 0) return result;
     6         Arrays.sort(num);
     7         result.add(new ArrayList<Integer>());
     8         subset(num, 0, new ArrayList<Integer>());
     9         return result;
    10     }
    11     public void subset(int[] num, int pos, ArrayList<Integer> row){
    12         int pre = Integer.MIN_VALUE;
    13         for(int i = pos; i < num.length; i ++){
    14             if(num[i] != pre){
    15                 pre = num[i];
    16                 ArrayList<Integer> nrow = new ArrayList<Integer> (row);
    17                 nrow.add(pre);
    18                 result.add(nrow);
    19                 subset(num, i + 1, nrow);
    20             }
    21         }
    22     }
    23 }
  • 相关阅读:
    Autofs
    markdown 基本语法
    Why Linux Doesn’t Need Defragmenting
    How to reconfigure installed dpkg package (tzdata, locales)
    weblogic性能监控
    exec
    在Oracle中查询表的大小
    hadoop主要概念的理解和学习
    ORACLE ASM中查询表空间使用情况、数据文件路径、裸设备磁盘总大小剩余大小
    linux 查看内存和cpu占用比较多的进程
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3420610.html
Copyright © 2011-2022 走看看