温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

LeetCode如何解决转变数组后最接近目标值的数组和问题

发布时间:2021-12-15 11:16:02 来源:亿速云 阅读:166 作者:小新 栏目:大数据

这篇文章将为大家详细讲解有关LeetCode如何解决转变数组后最接近目标值的数组和问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1

 题目描述

给定一个整数数组 arr 和一个目标值 target ,返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近  target (最接近表示两者之差的绝对值最小)如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。如输入arr = [4,9,3], target = 10,输出3,输入arr=[60864,25176,27249,21296,20204],target=56803,输出11361。

2

 题解

思路:前缀和,单调性
本题首先要对题目有深入的理解。对于arr[i],数组和S=sum(arr[0:i]+arr[i]*(len(arr)-i)),因此当对arr进行排序后,发现S是关于arr的单调函数,

因此当出现S>=target时,意味着目标值在(arr[i-1],arr[i]]之间。也就是说在(arr[i-1],arr[i]]之间存在一个数x,使得sum(arr[0:i]+x*(len(arr)-i))=target。此时求出的x可能是小数,因为要求满足条件的最小整数,所以根据小数具体值判断上取整还是下取整即可  (类似四舍五入,但当小数部分是0.5时要下取整。找例子具体计算一下就可以理解)  。如果S始终小于target,则根据题目要求返回arr中的最大值。
class Solution:    def findBestValue(self, arr: List[int], target: int) -> int:        arr.sort()        pre = 0        for i in range(0,len(arr)):            if pre+arr[i]*(len(arr)-i)>=target:                x = (target-pre)/(len(arr)-i)                if x%1>0.5: return ceil(x)                else : return floor(x)            pre += arr[i]        return arr[-1]

关于“LeetCode如何解决转变数组后最接近目标值的数组和问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI