[バックトラッキング] [leetcode]アレイのすべての可能なサブセットを出力します(べき集合)

トピック:

整数の配列numsを指定すると、配列内の要素は互いに異なります。この配列のすべての可能なサブセット(べき集合)を返します。

ソリューションセットに重複するサブセットを含めることはできません。ソリューションセットは任意の順序で返すことができます。

例1:

入力:nums = [1,2,3]
出力:[[]、[1]、[2]、[1,2]、[3]、[1,3]、[2,3]、[1、 2,3]]

ソース:

78. 子集

インタビューの質問08.04。パワーセット

問題解決のアイデア:バックトラック

この質問は、  基本的に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();
        }
    }
};

 

おすすめ

転載: blog.csdn.net/hbuxiaoshe/article/details/115012548