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