前往
大廳
主題

LeetCode - 1300. Sum of Mutated Array Closest to Target 解題心得

Not In My Back Yard | 2023-02-26 12:00:04 | 巴幣 0 | 人氣 123

題目連結:


題目意譯:
給定一個整數陣列 arr 以及一個目標值 target,回傳一整數值,使得我們可以把給定陣列中所有大於該整數值的整數變成該值,且使得陣列總和與 target 盡可能地接近。

在平手的情況下,則回傳其中的最小整數值。

注意到答案不一定是 arr 中的數字。

限制:
1 ≦ arr.length ≦ 10 ^ 4
1 ≦ arr[i], target ≦ 10 ^ 5



範例測資:
範例 1:
輸入: arr = [4,9,3], target = 10
輸出: 3
解釋: 當使用 3 時,arr 變為 [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),如這題

假設現在猜了一個整數值 M,掃過一次陣列加總其元素。其中當有元素值 > M 時,將其值視為 M(代表將該元素變為 M)。

如果得到的總和 > target,則代表我們猜得太大了,應該猜小一點的 M 值才行;反之,我們可以試著猜更大的 M 值。

最後便可以得到一個使總和盡可能接近 target 且總和 ≦ target 的整數值(稱此值為 K)。



但我們的目標不完全是這樣,我們只需要總和盡可能接近 target 的條件。因此此時 K 和 K + 1 有可能都是答案候選人。

而如果 K + 1 得出的總和比較接近的話,則回傳 K + 1;反之回傳 K。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作