參考LeetCode官網的解答。
思路:
雙重二分搜索,第一重搜索value值,
value最小值爲1,最大值爲max(arr)。
找到轉變後數組和在滿足小於target的條件下的最大下標,
記爲ans,比較ans與ans加一的結果。
第二重搜索爲在排好序的數組上找到對應值應插入的下標。
from typing import *
import bisect
class Solution:
'''
雙重二分搜索
'''
def findBestValue(self, arr: List[int], target: int) -> int:
sum_arr=[]
arr.sort()
tem_sum=0
# sum_arr.append(0)
for val in arr:
tem_sum+=val
sum_arr.append(tem_sum)
l,r=0,max(arr)
#這裏搜索的是剛好小於等於target的value值
ans=-1
while l<=r:
mid=(l+r)//2
#返回的是最後一個小於等於mid的位置
it=bisect.bisect_left(arr,mid)
if it==0:
cur_val=(len(arr)-it)*mid
else:
cur_val=sum_arr[it-1]+(len(arr)-it)*mid
if cur_val<=target:
ans=mid #這裏做一個記錄,循環結束後便於找到結果
l=mid+1
else:
r=mid-1
def check(x):
return sum(x if num>=x else num for num in arr)
return ans if abs(check(ans)-target)<=abs(check(ans+1)-target) else ans+1