Subsets位运算版

来源:互联网 发布:淘宝商城男装休闲t恤 编辑:程序博客网 时间:2024/06/05 11:15

题目描述:

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的二进制表达每位是否为1if((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可以参考一下.位运算操作可以参考程序中位运算的妙用

原创粉丝点击