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

參考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

 

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