題目連結(jié):
題目意譯:
給定一個整數(shù)陣列 arr 以及一個目標值 target,回傳一整數(shù)值,使得我們可以把給定陣列中所有大於該整數(shù)值的整數(shù)變成該值,且使得陣列總和與 target 盡可能地接近。
在平手的情況下,則回傳其中的最小整數(shù)值。
注意到答案不一定是 arr 中的數(shù)字。
限制:
1 ≦ arr.length ≦ 10 ^ 4
1 ≦ arr[i], target ≦ 10 ^ 5
範例測資:
範例 1:
輸入: arr = [4,9,3], target = 10
輸出: 3
解釋: 當使用 3 時,arr 變?yōu)?[3, 3, 3],其總和為 9。而此為最佳解。
範例 2:
輸入: arr = [2,3,5], target = 10
輸出: 5
範例 3:
輸入: arr = [60864,25176,27249,21296,20204], target = 56803
輸出: 11361
解題思維:
首先我們稍微把目標改變一下,變成「在總和 ≦ target 的情況下,使得總和與 target 盡可能地接近」。接著我們對「答案」本身進行二分搜尋法(Binary Search),如
這題。
假設(shè)現(xiàn)在猜了一個整數(shù)值 M,掃過一次陣列加總其元素。其中當有元素值 > M 時,將其值視為 M(代表將該元素變?yōu)?M)。
如果得到的總和 > target,則代表我們猜得太大了,應(yīng)該猜小一點的 M 值才行;反之,我們可以試著猜更大的 M 值。
最後便可以得到一個使總和盡可能接近 target 且總和 ≦ target 的整數(shù)值(稱此值為 K)。
但我們的目標不完全是這樣,我們只需要總和盡可能接近 target 的條件。因此此時 K 和 K + 1 有可能都是答案候選人。
而如果 K + 1 得出的總和比較接近的話,則回傳 K + 1;反之回傳 K。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。