傳送門
給定一組不含重複元素的整數陣列 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 可以對應到如下的8中標記[, [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
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...