原文:write a method that returns all subsets of a set.
譯文:寫乙個函式返回乙個集合中的所有子集。
對於乙個集合,它的子集一共有2n 個(包括空集和它本身)。它的任何乙個子集,我們都可以理解為這個集合本身的每個元素是否出現而形成的乙個序列。比如說,對於集合,空集表示乙個元素都沒出現,對應;子集,表示元素2沒出現(用0表示),1,3出現了(用1表示),所以它對應 。這樣一來,我們發現,的所有子集可以用二進位制數000到111 的8個數來指示。泛化一下,如果乙個集合有n個元素,那麼它可以用0到2n -1 總共2n 個數的二進位制形式來指示。每次我們只需要檢查某個二進位制數的哪一位為1,就把對應的元素加入到這個子集就ok。**如下:
typedef vector> vvi;
typedef vectorvi;
vvi get_subsets(int a, int n)
j >>= 1;
++idx;
}subsets.push_back(subset);
}return subsets;
}
解這道題目的另一種思路是遞迴。這道題目為什麼可以用遞迴?因為我們能找到比原問題規模小卻同質的問題。比如我要求的所有子集,我把元素1拿出來,然後去求的所有子集,的子集同時也是 的子集,然後我們把的所有子集都加上元素1後,又得到同樣數量的子集,它們也是的子集。這樣一來,我們就可以通過求的所有子集來求 的所有子集了。而同理,也可以如法炮製。**如下:
vvi get_subsets1(int a, int idx, int n)
else
j >>= 1;
++idx;
}subsets.push_back(subset);
}return subsets;
}vvi get_subsets1(int a, int idx, int n)
else
else
}} int main()
; int n = 0, i = 0;
scanf("%d", &n);/*沒有資料合法性檢查*/
for (i = 0; i < n; ++i) array[i] = i+1;
perm(array, n, 0);
return 0;}4
1234
1243
1324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123
press any key to continue
全排列 全排列ii 子集 子集ii
2 全排列ii 3 子集 4 子集ii 5 資料排列 解題步驟 首先,要通過讀題完成下面三個步驟 1 描述解的形式,定義乙個解空間,它包含問題的所有解。2 構造狀態空間樹。3 構造約束函式 用於殺死節點 標準回溯模板 回溯演算法,複雜度較高,因為回溯演算法就是暴力窮舉,遍歷整顆決策樹是不可避免的 r...
求子集 全排列
求子集 給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 思路 1 確定乙個tags標記陣列,用於確定某個元素是否被選擇 2 確定遞迴的終止條件為 確定元素是...
LeetCode Subsets 求陣列子集
given a set of distinct integers,s,return all possible subsets.note for example,if s 1,2,3 a solution is 3 1 2 1,2,3 1,3 2,3 1,2 分析 每個元素,都有放或者不放兩種選擇。深...