leetcode1300:转变数组后最接近目标值的数组和

思路如下:
先把数组从小到大排序,然后依次遍历数组,当前index为i,前0到i-1个数字的和为s,则剩余的值为target-s,假如当前arr[i]*(len(arr)-i)已经大于target-s了,则说明可以从当前第i个值开始,将所有之后的值均设置为同一个值,来逼近target,如果小于target-s,则说明即使从当前第i个值开始,将所有之后的值都设置为同一个值,也依旧会小于target,不是最优解。当大于target-s,则需要有一个边界判断,mean=target-s/(len(arr)-i),最优的value值是向上还是向下,可以通过判断当前mean和前后两个int值的差距,来决定选择哪个int值。
之所以找到一个一个最优解后就不用再向下找的原因是,假设在第i个找到了最优解,那么第i+1个,value只能在arr[i]-arr[i+1]中间取,无论如何当前的值是已经大于arr[i]*(len(arr)-i)的,哪怕向下取整也依旧是大于,不可能存在比第i个值找到的最优解还要逼近target。

class Solution:    
	def findBestValue(self, arr: List[int], target: int) -> int:        
		arr.sort()
		s = 0
        	for i in range(len(arr)):            
        		dis = target - s            
        		num = len(arr)-i            
        		if num*arr[i] >= dis:                
        			float_mean = dis/(len(arr)-i)                
        			int_mean = int(float_mean)                
        			if (float_mean-int_mean) > 0.5:                    
        				return int_mean + 1                
        			else:                    
        				return int_mean            
        		s += arr[i]        
        	return arr[-1]
        ```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值