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,就說明一個數都不取,即爲空數組。這樣就可以取到數組的所有子集了。這裏我用的是Python字符串的格式化輸出,輸出的二進制字符串並不都是3,所以從後向前遍歷,這樣保證所有的可能都取到。

源碼

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:b}'.format(num)
            for index, value in enumerate(num[::-1]):
                if value == '1':
                    temp.append(nums[index])
            ret.append(temp)
        return ret

謝謝大家

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章