タイトルの説明
これで、繰り返し要素のない整数のセットSがあります。Sのすべてのサブセットを検索します。
注:指定
するサブセットの要素は、昇順ではない順序で配置する必要があります。
ソリューションセットに重複する要素を表示することはできません。
例:
if S = [ 1,2,3]、ソリューションセットは次のとおりです:
[↵[3]、↵[1]、↵[2]、↵[1,2,3]、↵[1,3]、↵[2 、3]、↵[1,2]、↵[]↵]
分析
- 各要素は、セットに参加しない機会に参加することを選択する必要があります。
- したがって、バックトラッキングメソッドを使用できます。各位置は空にすることも、位置の要素にすることもできます。
Javaコード
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(S == null || S.length == 0){
return res;
}
Arrays.sort(S);
helperSub(S,0,new ArrayList<>(),res);
Collections.sort(res, new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
if (o1.size()!=o2.size()) {
return o1.size()-o2.size();
}else {
for (int i = 0; i < o1.size(); i++) {
int comp=o1.get(i)-o2.get(i);
if (comp!=0) return comp;
}
}
return 0;
}
});
return res;
}
private void helperSub(int[] s, int curIndex, ArrayList<Integer> cur, ArrayList<ArrayList<Integer>> res) {
if(curIndex == s.length){
res.add(new ArrayList<>(cur));
}else{
//CurIndex处的 s元素不加入集合内
helperSub(s,curIndex+1,cur,res);
//curIndex 处 s元素加入集合内
cur.add(s[curIndex]);
helperSub(s,curIndex+1,cur,res);
cur.remove(cur.size()-1);
}
}
}
方法2
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> listAll = new ArrayList<>();
public ArrayList<ArrayList<Integer>> subsets(int[] num) {
if (num == null || num.length <= 0)
return listAll;
ArrayList<Integer> list = new ArrayList<>();
Arrays.sort(num);
Findsubset(num, 0, list);
//排序
Collections.sort(listAll, new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
if (o1.size()!=o2.size()) {
return o1.size()-o2.size();
}else {
for (int i = 0; i < o1.size(); i++) {
int comp=o1.get(i)-o2.get(i);
if (comp!=0) return comp;
}
}
return 0;
}
});
return listAll;
}
public void Findsubset(int[] set, int start, ArrayList<Integer> list) {
listAll.add(new ArrayList<>(list));
for (int i = start; i < set.length; i++) {
list.add(set[i]);
Findsubset(set, i + 1, list);
list.remove(list.size() - 1);
}
}
}