leetcode 第78题 子集 python解法(用时48ms)

leetcode 第78题 子集 python解法(用时48ms)

问题分析

该问题要求返回数组的所有子集,一个数组子集的个数等于2的数组长度次幂(2^(len(nums))。首先这道题有多种解法:有使用深度优先遍历来做的,还有使用递归法来做,还有一种解法是使用位运算来计算。比如,数组[1,2,3]的长度为3,那么子集的个数就等于8,而从0到7如果分别用二进制表示就是000,001,010,011,100,101,110,111这8个。我们可以将二进制字符串与原数组对应(长度都等于3)。当二进制某位上的数组为0时,就不去取原数组上对应的数,如果等于1,就将数组的数取出放新的数组中。比如说101,我们就可以取对应数组上第一和第二位的数组成新数组[1,3]。而000,就说明一个数都不取,即为空数组。这样就可以取到数组的所有子集了。

源码

class Solution:
    ret = []
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        length = len(nums)
        ret = []
        for num in range(2**length):
            temp = []
            num = '{0:{a}b}'.format(num, a=length)
            for index, value in enumerate(num):
                if value == '1':
                    temp.append(nums[index])
            ret.append(temp)
        return ret

谢谢大家

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Whyalwaysxu/article/details/85217656