从一个数组中找出最接近目标_LeetCode每日一题 | 转变数组后最接近目标值的数组和...
题目来源: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每日一题 | 转变数组后最接近目标值的数组和...相关推荐
- 编写一个程序,从10亿个数字的数组中找出100个最大的数字
本文翻译自:Write a program to find 100 largest numbers out of an array of 1 billion numbers I recently at ...
- 从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法
比起讨论已经存在的大牛,我们更希望有更多有潜力的前端小伙伴成为大牛,只有这样,前端在未来才能够持续不断的发光发热. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场 ...
- 改进,从一个数组中找出 N 个数,其和为 M 的所有可能
特此说明,本文算法改自于<从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法>一文.本文不同的是,采用二进制正序表示法,这种实现思路更直观.更简单些. 问题 从一个 ...
- c++如何输入数组_从一个数组中找出 N 个数,其和为 M 的所有可能最 nice 的解法...
编者按:本文由前端狂想录公众号授权奇舞周刊转载. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场景中. 可以这样说,有 90% 以上的前端工程师不会做这个题目. ...
- 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。
问: /** 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数 ...
- 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标
题目链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/ 给定一个整数数组 nums ...
- 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使用两遍. ...
- JS实现 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
题目:(JS实现) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 四种方法如下: 方法一:暴力破解法,和值匹配 //暴力 ...
- java,给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
标题:java,给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 一.示例 二.题解 方法一,暴力法:使用双重for循环,每 ...
最新文章
- 语音识别框架最新进展——深度全序列卷积神经网络登场
- awk应用小结(所有命令行均经调试)
- Java锁详解:“独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁+线程锁”
- 【转载】ERP系统中的存货计价过程
- html源码md风格,code/html.md at master · Rongx/code · GitHub
- 第一百七十二节,jQuery,动画效果
- TCP首部报文段格式
- 安卓监听软键盘搜索键
- favicon图标制作
- 举例说明Java的反射机制,简单的Java反射机制
- SQL Server 2005 Service Pack 4 下载地址
- java简历项目经验大全,不吃透都对不起自己
- 【优化算法】模拟退火算法简介
- linux服务器python安装
- Mac批量恢复废纸篓文件
- Ubuntu安装OpenGL
- 1052 卖个萌 (20分)特殊符号输入
- C语言中阶第三篇:循环语句do while透析以及循环语句总结(执行次数、执行特点和循环英文的详解)
- 无法显示页面,因为发生内部服务器错误。
- 完美解决MSSQL安装问题“Polybase要求安装Oracle JRE 7更新51(64位)”方案
热门文章
- springboot webservice cxf 客户端调用
- PHP API接口GETPOST请求封装(通用)
- Android Service与IntentService区别
- mongoose $sum
- mongoose 通过账号密码连接 Error: Password contains an illegal unescaped character
- 局域网抢答器_基于童芯派的抢答器V1.0
- 软件测试用例项目写作,通用测试用例写作方法
- matlab如何解不等式,如何用MATLAB求解不等式组的所有可能解
- 小程序·云开发的HTTP API调用丨实战
- 【BZOJ4559】【JLOI2016】—成绩比较(拉格朗日插值+dp)