leetcode 第78題 子集 python解法(用時48ms)
阿新 • • 發佈:2019-01-06
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