トピック:
整数の配列numsを指定すると、配列内の要素は互いに異なります。この配列のすべての可能なサブセット(べき集合)を返します。
ソリューションセットに重複するサブセットを含めることはできません。ソリューションセットは任意の順序で返すことができます。
例1:
入力:nums = [1,2,3]
出力:[[]、[1]、[2]、[1,2]、[3]、[1,3]、[2,3]、[1、 2,3]]
ソース:
問題解決のアイデア:バックトラック
この質問は、 基本的に1 ... nでk個の可能なすべての組み合わせを返すことと同じです。違いは次のとおりです。この質問のkは固定されておらず、その値は0,1,2、...、length(nums )。
選択した数値のセットを記録するための可変パスを定義します。
- 再帰的終了条件:path.size()== kの場合
- 結果は次の条件を満たす:再帰が終了するとき
- 剪定条件:パスの桁数+残りの数字+現在のi <kが指す数、つまり次の桁がパスに書き込まれ、パスの数が十分ではありませんk。
c ++コード:
class Solution {
public:
vector< vector<int> > result;
vector<int> path;
vector< vector<int> > subsets(vector<int>& nums) {
// 子集个数分别是0,1,2,...,直到nums.size()
for (int i = 0; i <= nums.size(); i++) {
back(nums, 0, i);
}
return result;
}
void back(const vector<int>& nums, int start, int k) {
if (path.size() == k) {
result.push_back(path); // 输出
return;
}
for (int i = start; i < nums.size(); i++) {
if (path.size() + nums.size() - i + 1 < k) break; // 剪枝
path.push_back(nums[i]);
back(nums, i+1, k);
path.pop_back();
}
}
};