题目描述:
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.
(给定一组不同的整数S,返回所有可能的子集。
注:
子集中的元素必须是非降序的。
解决方案集不得包含重复子集。)
For example,
If S = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路:将数组看为一个二进制串,1表示有这个数,而0表示没有,例如101意思就是[1,3],111表示[1,2,3],010表示[2],
而该数组的所有子集则是从000到111一共2^array.length种,遍历这些二进制串,将每个二进制串中的1找出,并且
将其对应数组中的数放入结果集即可。
public class Subsets {
public static List<List<Integer>> subsets(int[] S)
{
List<List<Integer>> result = new ArrayList();
int total = 1 << S.length;
//i就是000到111十进制表达
for(int i=0;i<total;i++)
{
List<Integer> list = new ArrayList<Integer>();
int index = S.length-1;
int mid = i;
while(mid>0)
{
//判断i的二进制表达每位是否为1
if((mid&1)==1)
{
list.add(S[index]);
}
index--;
mid >>= 1;
}
result.add(list);
}
return result;
}
public static void main(String[] args) {
int array[]={1,2,3};
List<List<Integer>> result=subsets(array);
for(int i=0;i<result.size();i++)
{
for(int j=0;j<result.get(i).size();j++)
{
System.out.print(result.get(i).get(j)+" ");
}
System.out.println("\n");
}
}
}
本题还有一种回溯法 Subsets可以参考一下.位运算操作可以参考 程序中位运算的妙用。