[Leetcode題解]轉變數組後最接近目標值的數組和

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

image.png

又是一道數組題,最近苦苦練數組題目。這個題,仔細一看發現問題和數組中元素的順序不要緊,這個時候先排個序,這樣每每能容易求解。數組

拍完序後仔細觀察到這個題,忽然變得明朗起來,假設遍歷到排序後列表的第i個位置,假設取當前值爲value,則後邊的數所有都變成了value。計算他的值是否大於target,假設大於target,那麼咱們的value必定是i-1個位置和i個位置的值之間咱們把當前位置設置爲i-1,判斷i-1以前的和(包括i-1)left_sum,而後用target-left_sum去除以剩下的元素的個數,這裏須要判斷一下,由於是整數,因此要在這個數的取上限,和取下限兩個數中在判斷一次。spa

代碼寫的比較醜,以下:code

class Solution(object):
    def findBestValue(self, arr, target):
        """
        :type arr: List[int]
        :type target: int
        :rtype: int
        """
        if len(arr)==1:
            return target

        arr = sorted(arr)
        n = len(arr)

        left_sums = 0
        for index,x in enumerate(arr):
            if left_sums+(n-index)*x>=target:
                break
            left_sums+=x

        index-=1

        ans = (target-left_sums)//(n-1-index)

        if abs((ans+1)*(n-1-index)+left_sums-target)<abs(ans*(n-1-index)+left_sums-target):
            ans+=1

        return ans

總結:對於數組問題,若是問題答案和題目給出數組中元素的次序不要緊,排序每每能使得問題簡單,前提是,這個排序不影響結果。blog

例如這個問題,
arr = [4,9,3], target = 10
arr = [9,3,4], target = 10
這兩個不一樣的輸入對應的是同一個問題。排序

相關文章
相關標籤/搜索