[対処法]チャレンジデータ構造とアルゴリズム問題25 LeetCode 40.組み合わせ合計II(再帰とバックトラッキング)

星を見上げる人は笑ってはいけません

タイトル説明

配列candidatesとターゲット番号targetを指定して、candidatesすべての番号を見つけ、そのtarget組み合わせを作成できます。

candidatesの各番号は、各組み合わせで1回だけ使用できます。

説明:

すべての数値(ターゲット数を含む)は正の整数です。
ソリューションセットに繰り返しの組み合わせを含めることはできません。
例1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

例2:

输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
  [1,2,2],
  [5]
]

出典:LeetCode
リンク:https ://leetcode-cn.com/problems/combination-sum-ii
著作権はLeetCode が所有しています商用転載については、正式な許可書にご連絡ください。非商用転載については、出典を明記してください。

問題解決のアイデア

この質問も組み合わせの質問ですが、この質問の配列には重複する要素があります。組み合わせの質問では、重複をより適切に削除するために、最初に配列を並べ替え、次に隣接する要素が同じである場合は各レイヤーで並べ替えることができます。枝を切るだけ。

xiao_ben_zhuビッグブラザー図を参照してください

合計に注意してください。等しいかどうかを判断するだけでは、バーストする可能性があります。

var combinationSum2 = function (candidates, target) {
    
    
  let res = [];
  candidates.sort((a, b) => a - b);
  let dfs = (t, start, sum) => {
    
    
    if (sum >= target) {
    
     // 加这外层,超出范围了也终止,防爆栈
      if (sum === target) {
    
    
        res.push(t);
      }
      return;
    }
    // 组合
    for (let i = start; i < candidates.length; i++) {
    
    
      // 组合元素不能重复,去掉同一层重复的元素
      if (i > start && candidates[i] == candidates[i - 1]) continue;
      t.push(candidates[i]);
      // 组合元素去重,即当前选择和下一层的不能重复
      dfs(t.slice(), i + 1, sum + candidates[i]);
      t.pop();
    }
  }
  dfs([], 0, 0);
  return res;
};

やっと

記事の出力は簡単ではありません。みなさんがwaveをサポートしてくれることを願っています!

過去の選択:

リトルライオンフロントエンドのメモ倉庫

友達が読んで遊ぶのに便利なChaoyiのブログアクセスしてください

学如逆水行舟,不进则退

おすすめ

転載: blog.csdn.net/weixin_42429718/article/details/108666896