想法二:將二進位制的想法直接運用(官方遞迴)
小結給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: nums =[1
,2,3
]輸出:[[
3],[
1],[
2],[
1,2,
3],[
1,3]
,[2,
3],[
1,2]
,]
想法是按照二進位制來確定集合元素,乙個集合的子集數量是 2
n2^n
2n,將0到2
n2^n
2n的每乙個數字轉化為n位二進位制,可以發現其對應子集的情況。比如給出的示例中,有三個元素,一共有23=
82^3=8
23=8
個子集,將0到8
88轉化為3位二進位制分別為:000,001,010,011,100,101,110,111。1代表有當前元素,0代表沒有,答案就對應為,[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]
。
def
subsets
(self, nums: list[
int])-
> list[list[
int]]:
res =[[
]]lenth =
len(nums)
for i in
range(1
,2** lenth)
: temp =
s ="".
format
(i)[::
-1]print
(s)for x in
range
(len
(s))
:if s[x]
=='1':)
return res
執行結果: 通過
執行用時: 36 ms, 在所有 python3 提交中擊敗了81.17%的使用者
記憶體消耗: 13.7 mb, 在所有 python3 提交中擊敗了5.72%的使用者
我們思考一下為什麼子集的數量會是,其實是每次增加乙個元素,子集的數量就會翻一倍,而多出來的這一倍其實是原來的每乙個子集加上了該元素,舉個栗子就明白了。
例如[1]
的子集是,[1]
;
多出乙個元素[1,2]
的子集是[1]
和多一倍的[2],[1,2]
;
再多乙個元素[1,2,3]
的子集是,[1],[2],[1,2]
和多一倍的[3],[1,3],[2,3],[1,2,3]
。
題目很有意思,通過二進位制的轉化有了很多想法,官方的題解法大同小異,需要注意的是在用列表複製的時候會遇到深淺拷貝的問題,這裡提供一篇解答的部落格。
leetcode 字母異位詞分組(python)
題目 給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 所有輸入均為小寫字母。不考慮答案輸出的順序。注意 需熟悉字典的相關使用方法 class so...
leetcode 200 島嶼數量 python
給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。示例 1 輸入 11110 11010 11000 00000 輸出 1示例 2 輸入 11000 11...
leetcode 字母異位詞分組 python3
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 所有輸入均為小寫字母。不考慮答案輸出的順序。python中使用 字典 維護乙個分組表,鍵值 key...