Link: https://oj.leetcode.com/problems/subsets/
Approach I: Recursion
http://blog.csdn.net/linhuanmars/article/details/24286377
注意:
1 这种解法生成解的顺序是:{{}, {1}, {2}, {1, 2}, {3}, {1, 3}, {2, 3}, {1, 2, 3}} //I can do this solution. updated @8.27.2014
对一个长度为n 的数组S,先生成它前 S[0...n-1] 个元素的所有subsets,然后向每个subset里依次添加S[n-1].
2 必须要有:
ArrayList<Integer> elem = new ArrayList<Integer>(result.get(i));
而不能直接result.get(i).add(S[index]), 否则原来的result.get(i)也会跟着改变。
Input: | [0] |
Output: | [[0],[0]] |
Expected: | [[],[0]] |
public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
if(S == null) return null;
Arrays.sort(S);
return helper(S, S.length - 1);
}
private ArrayList<ArrayList<Integer>> helper(int[] S, int index){
if(index == -1) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> elem = new ArrayList<Integer>();
result.add(elem);
return result;
}
ArrayList<ArrayList<Integer>> result = helper(S, index-1);
int size = result.size();//must get result's size here
//if for(int i=0;i<result.size();i++), since result increases in each for loop
//we will get Time limit exceeded error
for(int i = 0; i < size; i++){
ArrayList<Integer> elem = new ArrayList<Integer>(result.get(i));
elem.add(S[index]);
result.add(elem);
}
return result;
}
}
DFS II: http://blog.csdn.net/u011095253/article/details/9158397
这种解法生成解的顺序是:{{}, {1}, {1, 2}, {1, 2, 3}, {1, 3}, {2}, {2, 3}, {3}}
重点记 (同样可用于Combinations)@8.29.2014
public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(S == null || S.length == 0) return result;
ArrayList<Integer> tmp = new ArrayList<Integer>();
result.add(tmp);
Arrays.sort(S);
dfs(S, 0, tmp, result);
return result;
}
private void dfs(int[] S, int pos, ArrayList<Integer> tmp, ArrayList<ArrayList<Integer>> result){
//to add each element in S
for(int i = pos; i < S.length; i++){
tmp.add(S[i]);
result.add(new ArrayList<Integer>(tmp));
dfs(S, i+1, tmp, result);//i+1 not pos+1
tmp.remove(tmp.size()-1);
}
}
}
Approach II: Iterative
public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
//iterative
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(S == null || S.length == 0) return result;
ArrayList<Integer> list = new ArrayList<Integer>();
result.add(list);
Arrays.sort(S);
for(int i = 0; i < S.length; i++){
int size = result.size();//must record result's size first because result is increasing in each for loop
for(int j = 0; j < size; j++){
ArrayList<Integer> elem = new ArrayList<Integer>(result.get(j));
elem.add(S[i]);
result.add(elem);
}
}
return result;
}
}
Approach III: Iterative with binary number
public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
//iterative with binary number
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
Arrays.sort(S);
int size = 1<< S.length;
for(int i = 0; i < size; i++){
ArrayList<Integer> subset = convertIntToList(S, i);
result.add(subset);
}
return result;
}
private ArrayList<Integer> convertIntToList(int[] S, int i){
ArrayList<Integer> subset = new ArrayList<Integer>();
int index = 0;
for(int k = i; k > 0; k>>=1){
if((k & 1) == 1){//must add () around k&1
subset.add(S[index]);
}
index ++;
}
return subset;
}
}
相关题目:
可以看成是这道题的特殊情况。当且仅当item.size() == k时,把item加入结果。