LeetCode 1300. 转变数组后最接近目标值的数组和(二分查找)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1300. 转变数组后最接近目标值的数组和(二分查找)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
給你一個整數數組 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來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 先將數組排序,求出前綴和
- 要找的這個數ans上下限 [0, arr_max]
- 如果這個數ans比0還小,數組所有的數將變成ans,target > 0,不會更接近
- 如果這個數ans比數組最大的還大,數組所有的數不變,跟target的差,也不變,但題目要求最小的ans,所以ans的范圍是 [0, arr_max]
- 現在需要證明,數組的和與target的單調性:
假設選取的數為 v2, a[i-1] <= v2 < a[i]
此時,a[0]+a[1]+...+a[i?1]+v2+...+v2(n?i個)?target?式1a[0]+a[1]+...+a[i-1]+ v2+...+v2 (n-i個)-target-式1a[0]+a[1]+...+a[i?1]+v2+...+v2(n?i個)?target?式1
再次選擇數 v1,a[i-1] <= v1 < v2
此時,a[0]+a[1]+...+a[i?1]+v1+...+v1(n?i個)?target?式2a[0]+a[1]+...+a[i-1]+ v1+...+v1 (n-i個)-target - 式2a[0]+a[1]+...+a[i?1]+v1+...+v1(n?i個)?target?式2
上下做差:式1-式2 = (v2?v1)?(n?i)>=0(v2-v1)*(n-i) >= 0(v2?v1)?(n?i)>=0
選擇數 v1,v1 < a[i-1] < v2
此時,a[0]+a[1]+...+a[i?2]+v1+...+v1(n?i+1個)?target?式3a[0]+a[1]+...+a[i-2]+ v1+...+v1 (n-i+1個)-target - 式3a[0]+a[1]+...+a[i?2]+v1+...+v1(n?i+1個)?target?式3
上下做差:式1-式3 = a[i?1]?v1+(v2?v1)?(n?i)>=0a[i-1]-v1+(v2-v1)*(n-i) >= 0a[i?1]?v1+(v2?v1)?(n?i)>=0
所以上式是單調遞增的!可以進行二分查找
總結
以上是生活随笔為你收集整理的LeetCode 1300. 转变数组后最接近目标值的数组和(二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 266. 回文排列(计
- 下一篇: LeetCode 467. 环绕字符串中