LeetCode day24 子集 位運算 py

2021-09-24 02:37:00 字數 2097 閱讀 4252

傳送門

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。

**說明:**解集不能包含重複的子集。

示例:

輸入: nums = [1,2,3]

輸出:[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

]

參考題解

時間複雜度是 o(2

n∗n)

o(2^n*n)

o(2n∗n

),空間複雜度o(2

n)

o(2^n)

o(2n),

執行用時:48ms

48 ms

48ms

位運算

總個數為2

n2^n

2n,排列順序可以想到2進製位運算,

如輸入[1,2,3],輸出排列方式有8種,依次將1往左移位和原數進行與運算 1

<

i1<

1<

i [, [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]

可以對應到如下的8中標記

0 0 0,0 0 1,0 1 0,0 1 1

1 0 0,1 0 1,1 1 0,1 1 1

class

solution

:def

subsets

(self, nums)

:## 時間較長

len_nums=

len(nums)

total=

2**len_nums

res=

for i in

range

(total+1)

: flag_list=[0

for i in

range

(len_nums)

]#用falg_list標記對應的每個是否存在

for j in

range

(len_nums)

: bit=

1

#判斷該為是否為1

flag_list[j]

=1

lists=

[nums[j]

for j in

range

(len_nums)

if flag_list[j]==1

]

return res

if __name__==

"__main__"

: sol=solution(

) m=[1

,2,3

] n=

3 num=sol.subsets(m)

print

(num)

class

solution

:def

subsets

(self, nums)

:#去掉了可不要的操作 ,優化了時間

len_nums=

len(nums)

total=

2**len_nums

res=

for i in

range

(total)

: lists=

[nums[j]

for j in

range

(len_nums)if1

leetcode 子集 dfs,位運算

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 class solution vectorint subsets vector int nums 先上 cl...

位運算 最長子集

問題描述 有乙個整數序列 a1,a2,an.請找到乙個集合的乙個最長子集s,使得對於 i,j s,ai aj min ai,aj 其中 表示按位異或運算.輸入形式 需要輸入兩行,第一行輸入乙個數 n 1 n 105 表示數列a1,a2,an的長度。第二行輸入 n 個整數 a1,a2,an 1 ai ...

利用位運算求子集

紫書第189頁 給你乙個集合,讓你求集合的所有子集 我們都知道長為n的集合子集個數為 2 n 個 包含了空集 一般都是遞迴求子集,沒想到還可以運用位運算求 具體思路就不展開了,總的來說就是每個元素在子集裡都有兩種情況 取或不取 可以用0和1來代表,這就跟位運算的性質所吻合 include defin...