前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode刷题DAY 29:转变数组后最接近目标值的数组和

LeetCode刷题DAY 29:转变数组后最接近目标值的数组和

作者头像
三猫
发布2020-06-19 12:13:59
3970
发布2020-06-19 12:13:59
举报
文章被收录于专栏:机器学习养成记

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中的最大值。

代码语言:javascript
复制
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]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档