ソートとツーポインタで目標にいちばん近い 3 つの和を求める

整数の​並びから​ 3 つを​選んで​足し、​目標に​いちばん近い和を​返します。​並べ替えてから​ 1 つを​決め、​残りの​ 2 つを​両端の​指で​寄せて​探す練習です。

海外で定番の問題リスト 4 本には入っていません

問題

整数の並び nums と、整数 target を受け取ります。nums から位置の違う 3 つの数を選んで足し、できる和のうち target にいちばん近いものを返す関数を書いてください。返すのは選んだ位置ではなく、和の値です。

  • 「近い」は、和と target の差の大きさ (大きいほうから小さいほうを引いた値) が小さいことです。和が target とちょうど同じなら、それが答えです
  • いちばん近い和は 1 つに決まるものとします。たとえば target が 5 で、和 4 と和 6 がどちらも作れて、それより近い和が無い、という入力は渡しません
  • 同じ値が何度出てきてもかまいません。位置が違えば別の数として使えます
  • nums の長さは 3 以上 500 以下、値はどれも絶対値が 1000 以下、target は絶対値が 10000 以下です

入力と出力の例

例 1

-1、4、7 を選ぶと和は 10 で、11 との差は 1 です。差が 0 になる組はありません。

入力

nums = [4, -1, 7, 2, -5]
target = 11

出力

10

例 2

どの組の和も target より大きいときは、いちばん小さい和が答えになります。

入力

nums = [1, 1, 1, 0]
target = -5

出力

2

例 3

-8、3、5 で和がちょうど 0 になります。

入力

nums = [-8, 3, 5, 10, 6]
target = 0

出力

0

面接での聞かれ方

面接では、「足すとちょうど 0 になる 3 つの組を全部探す」問題を解いたあとの続きとして出されることが多いです。

  • 「ちょうど同じ和が無いときは、いちばん近い和を返してください」と、条件を変えて聞かれます
  • 「全部の組を試すと、長さ 500 でどれくらい時間がかかりますか?」と、素直な書き方の重さを聞かれます
  • 書き終えたあとに「並べ替えた理由は何ですか?」「指を動かして、答えを飛ばさないと言えますか?」と、考えの筋を聞かれます

ちょうどの和を探す問題との違いは、見つからなくても止まらず、見た和を全部「いまの候補」と比べ続けるところです。

アルゴリズムのチートシートの「配列と文字列」に、​この​型の​要点を​表と​コードで​まとめています。

main.py
def three_sum_closest(nums, target):
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(three_sum_closest([4, -1, 7, 2, -5], 11))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します