方法:二重ポインタ方法、第一ソートアレイ
A = [12,6,8,1,4,3 ] DEF SUM2(ターゲット): RES = [] = ソート(a)の L、R = 0、LEN(A)-1 、一方、L < R。 TMP = [0,0] であれば、[L] + [R] == ターゲット: TMP [0] = [L] TMP [ 1] = [R] res.append(TMP) L + = 1 、R - = 1つ のelif [L] + [R]> ターゲット: R - = 1 さもなければ: L+ = 1つの 戻り解像度 印刷(SUM2(9))
出力:[1,8]、[3,6]
方法2:最初の方法については、メインの時間は、ソートを行うことに費やされている、我々は、ソートを避けるためにハッシュを使用することができます。
DEF SUM2(ターゲット): DIC = {} RES = [] のための I における範囲(LEN(A)): TMP = [0,0] 、M = A [i]の 場合、ターゲット-M でDIC: TMP [0 ] = m個の TMP [ 1] =標的- M res.append(TMP) DIC [M] = iを 返す解像度の プリント(SUM2(10))
出力:[1,8]、[3,6]
方法3:確立ハッシュテーブルを排除
DEF :SUM2(ターゲット) RES = [] のための I における範囲(LEN(A)): TMP = [0,0] であれば 、標的[I] において、[I + 1]: TMP [0] = [I] TMP [ 1] =標的- [I] res.append(TMP) リターン解像度の プリント(SUM2(9))
出力:[[6,3]、[8,1]]
拡張:方法とは、三つ、四つ、および3つの数字の数、などに拡張することができます。
DEF SUM3(ターゲット): RES = [] のための I における範囲(LEN(A)) のために、J における範囲(I + 1 、(a)は、LEN): TMP = [0,0,0] であれば標的- [I] -a [J] で[J + 1]: TMP [0] = [I] TMPを[ 1] = [J] TMPを[ 2] =ターゲット[I] - [ J] res.append(tmp)に 戻り RES
プリント(SUM3(13))
出力:[[6]、[4,3]、[8,1、4]
DEF sum4(ターゲット): RES = [] のための I における範囲(LEN(A)) のために、J における範囲(I + 1 、LEN(A)) のために K に範囲(J + 1 、LEN(A )): TMP = [0,0,0,0] であれば、標的[I] -a [J] -a [K] における [K + 1 :]: TMP [0] = [I] TMP [ 1] = [J] TMPを[ 2] = [K] TMP [ - 3] =ターゲット[I] -a [j]を[K] res.append(TMP) 戻り RES
プリント(sum4(24))
出力:[12、8、1、3]
拡張:アレイがNではなく番号であるが、繰り返すことができません
A = [12,6,8,1,4,3 ] のRES = [] DEF nor_sum(ターゲット、POS、端、TMP): グローバルRES もしターゲット< 0: リターン もしターゲット== 0: res.append (TMP [:]) のための I における範囲(POS、エンド): tmp.append([I]) nor_sum(標的 -a [i]は、iは+ 1 、終わり、TMP)を tmp.pop() nor_sum ( 12 、0、LEN(a)は、[]) 印刷(RES)
出力:[12]、[8]、[1,3]、[8,4]
赤がマークとして:(主な違いは)繰り返すことができます
A = 12,6,8,4,3 ] のRES = [] DEF nor_sum(ターゲット、POS、端、TMP): グローバルRES もしターゲット< 0: リターン もしターゲット== 0: res.append(TMP [:]) のための I における範囲(POS、エンド): tmp.append([I]) nor_sum(標的 - [i]は、I、終了、TMP) tmp.pop() nor_sum( 12 、0、LEN(a)は、[]) 印刷(RES)
出力:[12]、[6,6]、[6]、[3,3]、[8,4]、[4,4]、[4]、[3、3、3、3]