标签:
问题来源:https://leetcode.com/problems/subsets/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
*
* <p>
* ClassName Subsets
* </p>
* <p>
* Description 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], [] ]
* </p>
*
* @author TKPad wangx89@126.com
* <p>
* Date 2015年3月20日 下午6:08:19
* </p>
* @version V1.0.0
*
*/
public class Subsets {
public List<List<Integer>> subsets(int[] S) {
List<List<Integer>> als = new ArrayList<List<Integer>>();// 返回的结果集合
if (S == null || S.length == 0) {
return new ArrayList<List<Integer>>();// 返回[]即可
}
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i <= S.length; i++) {
combine(S, 0, i, list, als);// 获取组合
}
return als;
}
// 对于一个元素有两种处理方式,要么将其加入组合之中,要么认为其不在组合之中
// 从字符数组中第begin个字符开始挑选number个字符加入list中
public static void combine(int[] cs, int begin, int number, List<Integer> list, List<List<Integer>> als) {
if (number == 0) {
ArrayList<Integer> temp = new ArrayList<Integer>(list);// 新开辟一个ArrayList对象,因为als的key存的是引用,不允许修改
Collections.sort(temp);// 升序排列
als.add(temp);
return;
}
if (begin == cs.length) {
return;
}
list.add(cs[begin]);// 将当前元素加入组合之中
combine(cs, begin + 1, number - 1, list, als);// 递归调用其后的元素
list.remove(list.indexOf(cs[begin]));// 认为当前元素不应该加入组合之中,将其移除
combine(cs, begin + 1, number, list, als);// 递归调用其后的元素
}
public static void main(String[] args) {
// Input: [0]
// Output: []
// Expected: [[],[0]]
System.out.println(new Subsets().subsets(new int[] { 1, 2, 3 }));
// Input: [4,1,0]
// Output: [[],[4],[1],[0],[4,1],[4,0],[1,0],[4,1,0]]
// Expected: [[],[0],[1],[4],[0,1],[0,4],[1,4],[0,1,4]]
System.out.println(new Subsets().subsets(new int[] { 4, 1, 0 }));
}
}
标签:
原文地址:http://blog.csdn.net/shijiebei2009/article/details/44513793