小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Subsets

          Posted on 2013-05-21 22:50 小明 閱讀(2128) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 數(shù)據(jù)結(jié)構(gòu)和算法
          Problem

          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],   [] ] 

          分析:
          因?yàn)橐蠼Y(jié)果集是升序排列,所以首先我們要對(duì)數(shù)組進(jìn)行排序。

          子集的長(zhǎng)度可以從0到整個(gè)數(shù)組的長(zhǎng)度。長(zhǎng)度為n+1的子集可以由長(zhǎng)度為n的子集再加上在之后的一個(gè)元素組成。

          這里我使用了三個(gè)技巧
          1。使用了一個(gè)index數(shù)組來(lái)記錄每個(gè)子集的最大索引,這樣添加新元素就很簡(jiǎn)單。
          2。使用了兩個(gè)變量start和end來(lái)記錄上一個(gè)長(zhǎng)度的子集在結(jié)果中的起始和終止位置。
          3。去重處理使用了一個(gè)last變量記錄前一次的值,它的初始值設(shè)為S[0]-1,這樣就保證了和數(shù)組的任何一個(gè)元素不同。

          代碼如下:
          public class Solution {
              public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
                  Arrays.sort(S);
                  
                  ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
                  ArrayList<Integer> indexs = new ArrayList<Integer>();
                  result.add(new ArrayList<Integer>());
                  indexs.add(-1);
                  
                  int slen = S.length;
                  int start=0,end=0;
                  for(int len=1;len<=slen;++len){
                      int e = end;
                      for(int i=start;i<=end;++i){
                          ArrayList<Integer> ss = result.get(i);
                          int index = indexs.get(i).intValue();
                          int last = S[0]-1;
                          for(int j = index+1;j<slen;++j){
                              int v = S[j];
                              if(v!=last){
                                  ArrayList<Integer> newss = new ArrayList<Integer>(ss);
                                  newss.add(v);
                                  result.add(newss);
                                  indexs.add(j);
                                  ++e;
                                  last = v;
                              }
                          }
                      }
                      
                      start = end+1;
                      end = e;
                  }
                  return result;
              }
          }
          主站蜘蛛池模板: 达州市| 当阳市| 德昌县| 洛扎县| 全州县| 长顺县| 卢龙县| 贞丰县| 城固县| 黄大仙区| 微博| 石渠县| 新野县| 双流县| 兴仁县| 临高县| 田林县| 乐陵市| 昭觉县| 张家港市| 揭阳市| 秭归县| 五台县| 澎湖县| 肇庆市| 讷河市| 沙坪坝区| 益阳市| 东至县| 黔西县| 松桃| 阳东县| 布尔津县| 翁源县| 化隆| 伊金霍洛旗| 南皮县| 鄢陵县| 大渡口区| 玛曲县| 香格里拉县|