1. 程式人生 > >leetcode 第78題 子集 python解法(用時48ms)

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

謝謝大家

在這裡插入圖片描述