[programmers]43165ターゲット番号
こんにちは!珂太での生存記録を開始した.
ブログでアルゴリズムの問題を公表しても、著作権の問題は気になりますが、プログラマーのQ&Aページから見ると、非商業的な用途でいいです.
白俊も問題のリンクをアップロードできると言っているので、負担なくアップロードしなければならない.
ソース:プログラマコードテスト練習
私たちはまず問題の構成を理解した.0から、配列に含まれる数値が加算され、減算されます.各depthには2^dノードのツリーがあります.
問題の上部にもヒントがあります.DFS/BFSと書いてありますコードを簡単に作成できます.
だからいっそ問題を考える方法を変えた.前のノードが次のノードに影響するので、DPを使って解放してもいいですか?
配列を操作する方法の呼び出しも少なくなったので、できるかもしれないと思います.
この問題では、2 D配列を宣言して値を保存する必要があります.
Array.fromメソッド(MDN)
次のドキュメントを見るとArrayfrom()のパラメータで、1つ目は類似配列オブジェクトまたはiterableオブジェクト、2つ目はmapfnです.
アレイのアクセス方法と文の重複は、パフォーマンスの低下を招く可能性がありますが、機能が不足しているため、正確な判断ができません.
ブログでアルゴリズムの問題を公表しても、著作権の問題は気になりますが、プログラマーのQ&Aページから見ると、非商業的な用途でいいです.
白俊も問題のリンクをアップロードできると言っているので、負担なくアップロードしなければならない.
質問する
ソース:プログラマコードテスト練習
私たちはまず問題の構成を理解した.0から、配列に含まれる数値が加算され、減算されます.各depthには2^dノードのツリーがあります.
問題の上部にもヒントがあります.DFS/BFSと書いてありますコードを簡単に作成できます.
に答える
function solution(numbers, target) {
let answer = 0;
const willVisit = [[0, 0]];
while (willVisit.length > 0) {
const [value, depth] = willVisit.shift();
if (depth === numbers.length && value === target) {
answer++;
continue;
}
if (depth < numbers.length) {
willVisit.push([value + numbers[depth], depth + 1]);
willVisit.push([value - numbers[depth], depth + 1]);
}
}
return answer;
}
私は自信を持ってコードを提出しました.これは効率的に最悪です.途中で枝打ちの条件を入れたが、失敗した.だからいっそ問題を考える方法を変えた.前のノードが次のノードに影響するので、DPを使って解放してもいいですか?
配列を操作する方法の呼び出しも少なくなったので、できるかもしれないと思います.
function solution(numbers, target) {
const dp = Array.from(Array(numbers.length + 1), () => new Array());
dp[0] = [0];
for (let i = 0; i < numbers.length; i++) {
for (const d of dp[i]) {
dp[i + 1].push(d + numbers[i]);
dp[i + 1].push(d - numbers[i]);
}
}
return dp[numbers.length].filter((d) => d === target).length;
}
😀 幸い成功したしかし、コードを書くときに疑問が生じた.なぜダイナミックプログラミングと呼ぶのですか?だから制作者を探して「カッコよかったから起きたんだよ」誰かが...🕶 ポスト
この問題では、2 D配列を宣言して値を保存する必要があります.
const dp = [];
for (let i = 0; i <= numbers.length; i++) {
dp.push([]);
}
最初はこのように設定されていましたが、コードは少し醜く見えました.Array.fromメソッド(MDN)
次のドキュメントを見るとArrayfrom()のパラメータで、1つ目は類似配列オブジェクトまたはiterableオブジェクト、2つ目はmapfnです.
const dp = Array.from(Array(numbers.length + 1), () => new Array());
2 D配列を直接作成できます.DFSバージョン
function solution(numbers, target) {
function DFS(value, depth) {
if (depth === numbers.length) {
if (value === target) return 1;
else return 0;
} else {
return (
DFS(value + numbers[depth], depth + 1) +
DFS(value - numbers[depth], depth + 1)
);
}
}
return DFS(0, 0);
}
BFSもタイムアウトしたので、もちろんDFSもタイムアウトすると思います.しかし、より効率的なアレイのアクセス方法と文の重複は、パフォーマンスの低下を招く可能性がありますが、機能が不足しているため、正確な判断ができません.
Reference
この問題について([programmers]43165ターゲット番号), 我々は、より多くの情報をここで見つけました https://velog.io/@ja960508/Programmers-43165-타겟-넘버テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol