[アルゴリズムプール]ターゲット番号
5975 ワード
問題の説明
n個の非負の整数.この数字を適当に加算または減算してターゲット番号を作成したいです.たとえば、[1,1,1,1,1,1]で数値3を作成するには、次の5つの方法があります.
使用可能な数値の配列番号、ターゲット番号のターゲットをパラメータとして指定したときに、適切に数値を加算して減算して、ターゲット番号を作成する方法の数を返します.
せいげんじょうけん
I/O例
に答える
import copy
def search(numbers, index, target, answer):
number_arr = copy.deepcopy(numbers)
if index > len(number_arr)-2 :
if sum(number_arr[:-1]) + number_arr[-1] == target:
answer[0] += 1
if sum(number_arr[:-1]) - number_arr[-1] == target:
answer[0] += 1
return
else:
search(number_arr, index + 1, target, answer)
number_arr[index] *= -1
search(number_arr, index + 1, target, answer)
def solution(numbers, target):
answer = [0]
search(numbers, 0, target, answer)
return answer[0]
search(numbers, index, target, answer)
は、numbersおよびindexが入力され、search(numbers, index + 1, target, answer)
が関数内で再帰的に呼び出され、インデックスのnumbers要素に−1を乗じたときにnumberの和がtargetと一致するかどうかを検証する関数である.再帰呼び出し時には、数値[i]に-1を乗じ、パラメータを乗じないで2回呼び出すことで、DFSを使用してバイナリツリーをブラウズする仕組みがあります.最終確認(sum(numbers)==target)は
index == len(numbers)-2
で終了して実行され、もう一度深さを下げる必要はなく、最終レベルまでに値を算出して結果を確認することで実行時間を短縮する.結果値をresponse[0]に保存し、pythonがintタイプを使用する場合、
call by value
のため、再帰呼び出しごとに正しい答えの個数が独立して蓄積されます.これはホットな問題です.したがって、listに保存して、すべての再帰呼び出しの結果値が1つの変数に同期するようにします.githubアドレス
https://github.com/bjih1999/algorithm/blob/master/programmers/DFS_BFS/%ED%83%80%EA%B2%9F%20%EB%84%98%EB%B2%84/solution.py
Reference
この問題について([アルゴリズムプール]ターゲット番号), 我々は、より多くの情報をここで見つけました https://velog.io/@byunji_jump/알고리즘-풀이-타겟-넘버テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol