又是一道數組題,最近苦苦練數組題目。這個題,仔細一看發現問題和數組中元素的順序不要緊,這個時候先排個序,這樣每每能容易求解。數組
拍完序後仔細觀察到這個題,忽然變得明朗起來,假設遍歷到排序後列表的第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
這兩個不一樣的輸入對應的是同一個問題。排序