[leetcode][40]Combination SumII解答!


  • クイズクリップ
  • 👓 問題の概要
    数字をあげましょうそれらの数字を組み合わせて、私の欲しい数字の組み合わせを見つけます!
    でも、見つけた組み合わせの間に重複があってはいけません!!私がくれた数字よりもっと書けない!!!
    トピックコードのホームページと問題の説明を参照してください.問題に答える
    🔑 問題を解く
    すべての状況がチェックされますか?結果は繰り返されませんか?じゃあ押して
    こんな方法がありましたが、この方法で解けるようになったので、別の方法を探しました!
    だから私はどうやって解いたの?
    答えが繰り返されるのは、同じ数字の間に何の違いもなく道を作ったからだ.
    同じ数字を书く道を一度だけ渡せばいいんだ!!!ドゥドゥ
    例:
    [1,2,2,2,5]の値が5の場合、
    1,2,5を通る道は一度だけチェックする必要があります.
    2番目の2を検査しなくても、3番目の2を検査しなくてもいいです.
    🥽 ソースコードとソースコード分析
    var combinationSum2 = function (candidates, target) {
      candidates.sort((a, b) => a - b); // 오름차순
      let answer = [];
      /**
       * @param {number[]} candidates
       * @param {number[]} path
       * @param {number} start
       * @param {number} target
       */
      const dfs = (_candidates, path, start, _target) => {
        // 다음 값도 체크해야한다!
        if (_target === 0) {
          answer.push(path);
          return;
        }
        if (_target < 0 || start > _candidates.length - 1) return;
    
        let next = start;
        while (_candidates[start] === _candidates[next]) next++;
    
        dfs(_candidates, path, next, _target);
    
        path.push(_candidates[start]);
        dfs(_candidates, [...path], start + 1, _target - _candidates[start]);
        path.pop();
      };
      dfs(candidates, [], 0, target);
    
      return answer;
    };
    🔨 問題ポスト
    おもしろい.
    人の草を見るのもおもしろい.
    世界は天才に満ちていて、私の時間は足りません.