【leetcode】#数组【Python】78. Subsets 子集 位运算

链接:

https://leetcode-cn.com/problems/subsets/

题目:

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]

我的解法: 对于每一个数,都是把所有当前集合append这个数,再append之前的所有集合。比如刚开始是[],来了一个1,[],[1] -> [],[1],[2],[1,2] -> [],[1],[2],[1,2],[3],[1.3],[2,3],[1,2,3]

class Solution(object):
    def subsets(self, nums):
        all_subsets = [[]]
        if nums:
            for num in nums:
                for idx in range(len(all_subsets)):
                    all_subsets.append(all_subsets[idx]+[num])
        return all_subsets

我的解法2: 比如[1,2,3],有2^3个子集,0-7的所有二进制表示比方5是101,则此时表示子集是[1,3]。两种解法用时相等。
算法思路如下:
对elem_num个数循环,i=0时,就把所有的j向右移0位,则0-7中二进制表示最后一位是1的要append num[0],比如1,3,5,7. 相当于知道了有3个数,8个子集,循环看第i个数要不要加进第j个子集,如果满足(j >> i) & 1,就加

class Solution(object):
    def subsets(self, nums):
        elem_num = len(nums)
        # 子集个数
        subset_num = pow(2, elem_num)
        subset_set = [[] for i in range(subset_num)]
        for i in range(elem_num):
            for j in range(subset_num):
            	# j的二进制数右移i位,如果末位数是1,则应该append
                if (j >> i) & 1:
                    #print "i,j,j >> i", i,j,j >> i
                    subset_set[j].append(nums[i])
        return subset_set

补充python位运算:5 -> 101 -> 5>>2 = 1

a = 0011 1100

b = 0000 1101

-----------------

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a  = 1100 0011

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值