パラレルセット(バイナリツリーDFS)
1917 ワード
質問:2つのローカルセットの合計が同じ場合、
YESなしでNOを出力
関連しているので、一部集合を求めるだけです. total-setSum==setSumと判別すればよい
再帰関数に加えて,初期集合の要素数をゼロに初期化する局所集合を定義し,
L+1の場合L次インデックスの処理
L+1===numbers.length時に停止した原因は
与えられた配列.lengthが5であると仮定すると、DFS(5)において配列の最後のインデックス4が処理されるからである.
YESなしでNOを出力
function solution(numbers) {
let answer = "NO";
let set = Array.from({ length: numbers.length }, (v) => 0);
let flag = 0;
const total = numbers.reduce((pre, cur) => pre + cur, 0);
function DFS(L) {
if (flag) return;
if (L === numbers.length) {
const setSum = set.reduce((pre, cur) => pre + cur, 0);
if (total - setSum === setSum) {
flag = 1;
return (answer = "YES");
}
return;
} else {
set[L] = numbers[L];
DFS(L + 1);
set[L] = 0;
DFS(L + 1);
}
}
DFS(0);
return answer;
}
集合[1,3,5,6,7,10]が与えられた場合,まずすべての数を含む集合と集合から比較を開始する.関連しているので、一部集合を求めるだけです.
再帰関数に加えて,初期集合の要素数をゼロに初期化する局所集合を定義し,
>flag変数を使用する理由は、同じ状況が見つかってもスタックフレームに再バインド可能な関数がいくつか存在するため、すぐに終了することができるからです。
しかし、上のコードは少し味のあるコードで、もっと効果的なのは2つのパラメータを使うことです。
以下は講師のコードです
function solution(numbers) {
let answer = "NO";
let flag = 0;
const total = numbers.reduce((pre, cur) => pre + cur, 0);
function DFS(L, sum) {
// if (flag) return;
if (L === numbers.length) {
if (total - sum === sum) {
flag = 1;
return (answer = "YES");
}
return;
} else {
DFS(L + 1, sum + numbers[L]);
DFS(L + 1, sum);
}
}
DFS(0, 0);
return answer;
}
DFS(0,0)の最初のパラメータはindexですL+1の場合L次インデックスの処理
L+1===numbers.length時に停止した原因は
与えられた配列.lengthが5であると仮定すると、DFS(5)において配列の最後のインデックス4が処理されるからである.
Reference
この問題について(パラレルセット(バイナリツリーDFS)), 我々は、より多くの情報をここで見つけました https://velog.io/@chuhyerin96/합이-같은-부분집합이진트리-DFSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol