LeetCode題目(Python實現) 子集

2021-10-04 23:57:57 字數 2057 閱讀 5744

想法二:將二進位制的想法直接運用(官方遞迴)

小結給定一組不含重複元素的整數陣列 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...