Middle-题目52:78. Subsets

题目原文:
Given a set of distinct integers, nums, return all possible subsets.

Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
题目大意:
给出一个无重复元素的数组,求出他的所有子集。
要求:
子集中的元素不能是递减的,且结果中不能有重复的子集。
题目分析:
既然是不重复的那就好办了,求数组的长度n,并遍历一个n位长的比特串,其中哪一位为1,原数组的哪个元素就加入子集。
源码:(language:java)

public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> subsets = new ArrayList<List<Integer>>();
        int count = 1<<nums.length;
        for(int j=0;j<count;j++) {
            List<Integer> subset = new ArrayList<Integer>();
            int index=0;
            int i=j;
            while(i!=0) {
                if(i%2==1)
                    subset.add(nums[index]);
                index++;
                i=i>>1;
            }
            subsets.add(subset);
        }
        return subsets;
    }
}

成绩:
2ms,beats 59.76%,众数3ms,44.63%
Cmershen的碎碎念:
计算机是基于二进制运算的,所以能用bit manipulate方法解决的问题往往都比较方便。但此题复杂度达到 O(2n) ,使用位运算比单纯的回溯也仅仅是易于理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值