Subsets
Posted on 2013-05-21 22:50 小明 閱讀(2128) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): 數(shù)據(jù)結(jié)構(gòu)和算法分析:
因?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;
}
}
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;
}
}