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