转变数组后最接近目标值的数组和

image.png

又是一道数组题,最近苦苦练数组题目。这个题,仔细一看发现问题和数组中元素的顺序没关系,这个时候先排个序,这样往往能容易求解。

拍完序后仔细观察到这个题,突然变得明朗起来,假设遍历到排序后列表的第i个位置,假设取当前值为value,则后边的数全部都变成了value。计算他的值是否大于target,假设大于target,那么我们的value一定是i-1个位置和i个位置的值之间我们把当前位置设置为i-1,判断i-1之前的和(包括i-1)left_sum,然后用target-left_sum去除以剩下的元素的个数,这里需要判断一下,因为是整数,所以要在这个数的取上限,和取下限两个数中在判断一次。

代码写的比较丑,如下:

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

总结:对于数组问题,如果问题答案和题目给出数组中元素的次序没关系,排序往往能使得问题简单,前提是,这个排序不影响结果。

例如这个问题,
arr = [4,9,3], target = 10
arr = [9,3,4], target = 10
这两个不同的输入对应的是同一个问题。


北语张益达
6 声望4 粉丝