星を見上げる人は笑ってはいけません
タイトル説明
配列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のブログにアクセスしてください〜
学如逆水行舟,不进则退