题目:
Given a set of distinct integers, 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,3], a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
题意:
给定一组不同的整数S,返回所有可能的子集。
注意:
子集中的元素必须按非降序排列。
解决方案集不能包含重复的子集。
解题思路:
可以使用回溯算法解决
解题思路可以借鉴下这么仁兄的博客,我觉得对回溯算法也算讲的很清晰,套路满满
这里题目要求的子集元素必须按非降序排序
那么刚开始我们需要对数组进行升序排序处理
其次,在内部的时候需要对辅助集合temp也需要做一个排序处理,这里需要重写sort方法
代码:
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
Arrays.sort(S);
ArrayList<Integer> temp = new ArrayList<Integer>();
backTracking(S,0,temp);
return list;
}
public void backTracking(int[] S, int start,ArrayList<Integer> temp) {
list.add(new ArrayList<Integer>(temp));
for(int i = start ;i < S.length;i++) {
temp.add(S[i]);
Collections.sort(temp);
backTracking(S, i+1,temp);
temp.remove(temp.size()-1);
}
/*
* 重写排序
*/
Collections.sort(list,new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
// TODO Auto-generated method stub
int o1s = o1.size();
int o2s = o2.size();
if(o1s != o2s) {
return Integer.compare(o1s, o2s);
}
else {
for(int i = 0;i<o1s;i++) {
int com = Integer.compare(o1.get(i), o2.get(i));
if(com != 0) {
return com;
}
}
}
return 0;
}
});
}