leetcode 子集 dfs,位運算

2021-10-03 17:26:09 字數 1226 閱讀 5646

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

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

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

輸出:[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

]

class

solution

} vectorint>>

subsets

(vector<

int>

& nums)

};

先上**:

class

solution

} ans.

push_back

(tmp);}

return ans;}}

;

首先,這道題可以使用位運算的原理是:陣列中每個位置的數都有「選與不選」兩種狀態,因此可以用二進位制進行狀態壓縮。

對於下面的**來說,i的含義其實就是列舉了所有的情況。

假設 n=3. 那麼就有2(n)種情況。因此 i<(1<3.

i = 0 : 0 0 0

i = 1 : 0 0 1

i = 2 : 0 1 0

i = 3 : 0 1 1

i = 4 : 1 0 0

i = 5 : 1 0 1

i = 6 : 1 1 0

i = 7 : 1 1 1

對於第二層迴圈:

for

(int k =

0, j = i;j >

0;j>>=

1, k++

)}

假設 i = 101,那麼 j = 101 , k = 0.

(j&1 == 1) 表示判斷 j 最後的二進位制位是否為1,k則是用來匹配nums下標的。

第一輪:j = 101,末位為1,條件滿足,nums[0] = 1 加進tmp,j 右移,k++;

第二輪:j = 10,末位為0,條件不滿足,j 右移,k++;

第三輪:j = 1,末位為1,條件滿足,nums[2] = 3 加進tmp,j 右移至0,k++;

迴圈結束,i = 101 對應的 tmp 陣列為[1,3].

這樣,就可以將所有的 i 二進位制位,即列舉的所有情況實現。

leetcode 78 子集(位運算求子集)

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 分析 含有n個元素的集合共有 1 一位後與 1的方式判斷最後一位是0還是1,如果是1,就把對應位置的數加入到...

leetcode輸出子集暴力法與dfs

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。1.暴力法 關鍵for cur in res res cur num i 2.dfs 深度優先含有每個元素的子集 關鍵 多層遞迴 class solution def subsets self,n...

子集和問題(dfs)

題目資訊 問題描述 對於乙個給定正整數的集合s 和正整數c,程式設計計算s的乙個子集s1,使得子集s1的和等於c。輸入格式 第一行有2個正整數n和c,第二行有n個正整數 輸出格式 一行資料,按輸入的順序輸出,若無解則輸出 no solution 輸入樣例 5 10 2 2 6 5 4 輸出樣例 2 ...