LeetCode 1300. 轉變數組後最接近目標值的數組和 | Python

1300. 轉變數組後最接近目標值的數組和


題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target

題目


給你一個整數數組 arr 和一個目標值 target ,請你返回一個整數 value ,使得將數組中所有大於 value 的值變成 value 後,數組的和最接近 target (最接近表示兩者之差的絕對值最小)。

如果有多種使得和最接近 target 的方案,請你返回這些整數中的最小值。

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

示例 1:

輸入:arr = [4,9,3], target = 10
輸出:3
解釋:當選擇 value 爲 3 時,數組會變成 [3, 3, 3],和爲 9 ,這是最接近 target 的方案。

示例 2:

輸入:arr = [2,3,5], target = 10
輸出:5

示例 3:

輸入:arr = [60864,25176,27249,21296,20204], target = 56803
輸出:11361

提示:

  • 1 <= arr.length <= 10^4
  • 1 <= arr[i], target <= 10^5

解題思路


思路:二分查找

本題當中,可能比較棘手的是題目中【value 爲整數,數組和接近 target】和【答案不一定是 arr 中的數字】。也就是說,題目要我們求的是最接近。

那麼現在的問題就可以轉變爲去考慮如何去評判接近?下面羅列最接近的可能情況:

  • 選定一個 value,轉變之後,數組求和等於 target。(當然,這是最理想的情況)
  • 選定的 value 值過大,接近程度變小;
  • 選定的 value 值過小,接近程度變大。
  • 第二種和第三種情況,反過來可能也能成立。

這如何去考慮第二種和第三種的情況,本篇幅所從採取的方案是確定上下邊界,取可能的 value 值進行比較。

具體的做法:

  • 先確定一個 value 值,對數組進行轉變,求和
  • 如果能使得轉變後的數組和是第 1 個大於等於 target 的,那麼就確定上下邊界
  • 因爲 value 是整數,那麼最終的答案可能落在 value,也可能是 value - 1

具體的代碼實現如下。

代碼實現


class Solution:
    def findBestValue(self, arr: List[int], target: int) -> int:
        def cacl_change_sum(arr, value):
            res = 0
            # 大於 value 的值要進行轉變
            for num in arr:
                res += min(num, value)
            
            return res

        left = 0
        right = max(arr)

        while left < right:
            mid = (left+ right) // 2
            # 計算轉化後的數組之和
            res = cacl_change_sum(arr, mid)
            # 查找第一個 value 使得轉變的數組和大於等於 target
            if res < target:
                left = mid + 1
            else:
                right = mid

        
        # 當找到第一個 value 使得轉變的數組和大於等於 target 時,答案可能落在 value 或 value - 1
        # 現在,比較兩者間的結果,接近程度越小,則是返回結果
        res1 = cacl_change_sum(arr, left)
        res2 = cacl_change_sum(arr, left - 1)

        if res1 - target < target - res2:
            return left
        return left - 1

實現結果


實現結果

總結


  • 先理清題意,由於有【value 爲整數,數組和接近 target】和【答案不一定是 arr 中的數字】的要求,所以題目可以從考慮如何去求最接近的方案出發;
  • 本篇幅使用的二分查找,具體的做法:
    • 先確定一個 value 值,對數組進行轉變求和
    • 如果此時的數組和是第一個大於等於 target 值,那麼此時可以確定上下邊界
    • 由於 value 必須是整數,那麼答案就可能落在 value 或 value - 1 上。

文章原創,如果覺得寫得好,歡迎關注點贊。微信公衆號《書所集錄》同步更新,同樣歡迎關注點贊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章