题目来源:LC1300

这道题目是一道比较经典的二分查找题。

我们注意到,当value越大时,数组之和越大,当value越小时,数组之和越小。因此,我们可以利用数组之和是value的单调递增函数这个性质来进行二分查找。

最大的可能value值是max(arr),因为在那之后继续增加value并不会改变数组里的元素值,从而无法改变数组之和。

最小的可能value值是target/n-1,这里n是数组的长度。value继续减小只会让数组之和与target渐行渐远。

因此,我们只需在这两个值之间进行二分查找即可。

def findBestValue(self, arr: List[int], target: int) -> int:    # 计算value为x时,数组之和    def getsum(x):        res = 0        for val in arr:            res = res + min(val, x)        return res    # 初始化    n = len(arr)    l = target // n - 1    r = max(arr)        # 二分查找    while l < r - 1:        mid = (l + r)//2        sum_arr = getsum(mid)        if sum_arr == target:            return mid        if sum_arr < target:            l = mid        else:            r = mid        if abs(getsum(l) - target) > abs(getsum(r) - target):        return r    return l

复杂度分析:

  • 时间上:外层二分查找最多需要log(max(arr))次循环,内层getsum函数需要最多n次循环。由于max(arr)最大不会超过10^5,因此 log(max(arr)) < 17 可以看做是一个常数。时间复杂度为O(n)。
  • 空间上:除去输入数组,我们只用了常数个变量,因此空间复杂度为O(1)。

从一个数组中找出最接近目标_LeetCode每日一题 | 转变数组后最接近目标值的数组和...相关推荐

  1. 编写一个程序,从10亿个数字的数组中找出100个最大的数字

    本文翻译自:Write a program to find 100 largest numbers out of an array of 1 billion numbers I recently at ...

  2. 从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法

    比起讨论已经存在的大牛,我们更希望有更多有潜力的前端小伙伴成为大牛,只有这样,前端在未来才能够持续不断的发光发热. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场 ...

  3. 改进,从一个数组中找出 N 个数,其和为 M 的所有可能

    特此说明,本文算法改自于<从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法>一文.本文不同的是,采用二进制正序表示法,这种实现思路更直观.更简单些. 问题 从一个 ...

  4. c++如何输入数组_从一个数组中找出 N 个数,其和为 M 的所有可能最 nice 的解法...

    编者按:本文由前端狂想录公众号授权奇舞周刊转载. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场景中. 可以这样说,有 90% 以上的前端工程师不会做这个题目. ...

  5. 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

    问: /** 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数 ...

  6. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标

    题目链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/ 给定一个整数数组 nums ...

  7. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使用两遍. ...

  8. JS实现 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    题目:(JS实现) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 四种方法如下: 方法一:暴力破解法,和值匹配 //暴力 ...

  9. java,给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    标题:java,给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 一.示例 二.题解 方法一,暴力法:使用双重for循环,每 ...

最新文章

  1. 语音识别框架最新进展——深度全序列卷积神经网络登场
  2. awk应用小结(所有命令行均经调试)
  3. Java锁详解:“独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁+线程锁”
  4. 【转载】ERP系统中的存货计价过程
  5. html源码md风格,code/html.md at master · Rongx/code · GitHub
  6. 第一百七十二节,jQuery,动画效果
  7. TCP首部报文段格式
  8. 安卓监听软键盘搜索键
  9. favicon图标制作
  10. 举例说明Java的反射机制,简单的Java反射机制
  11. SQL Server 2005 Service Pack 4 下载地址
  12. java简历项目经验大全,不吃透都对不起自己
  13. 【优化算法】模拟退火算法简介
  14. linux服务器python安装
  15. Mac批量恢复废纸篓文件
  16. Ubuntu安装OpenGL
  17. 1052 卖个萌 (20分)特殊符号输入
  18. C语言中阶第三篇:循环语句do while透析以及循环语句总结(执行次数、执行特点和循环英文的详解)
  19. 无法显示页面,因为发生内部服务器错误。
  20. 完美解决MSSQL安装问题“Polybase要求安装Oracle JRE 7更新51(64位)”方案

热门文章

  1. springboot webservice cxf 客户端调用
  2. PHP API接口GETPOST请求封装(通用)
  3. Android Service与IntentService区别
  4. mongoose $sum
  5. mongoose 通过账号密码连接 Error: Password contains an illegal unescaped character
  6. 局域网抢答器_基于童芯派的抢答器V1.0
  7. 软件测试用例项目写作,通用测试用例写作方法
  8. matlab如何解不等式,如何用MATLAB求解不等式组的所有可能解
  9. 小程序·云开发的HTTP API调用丨实战
  10. 【BZOJ4559】【JLOI2016】—成绩比较(拉格朗日插值+dp)