转变数组后最接近目标值的数组和
又是一道数组题,最近苦苦练数组题目。这个题,仔细一看发现问题和数组中元素的顺序没关系,这个时候先排个序,这样往往能容易求解。
拍完序后仔细观察到这个题,突然变得明朗起来,假设遍历到排序后列表的第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
这两个不同的输入对应的是同一个问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。