1300. 转变数组后最接近目标值的数组和(逐句解释代码)

61 篇文章 0 订阅
package LeetCode.OneThousandMore;

import java.util.Arrays;

public class OneThousandAndThreeHundreds {
    public int findBestValue(int[] arr, int target) {
        // 思路是:先排序,然后按照四舍五入规则求取target与当前size-i个元素的整数平均值m。
        // 如果,平均值小于等于当前arr[i],即最小值,则说明,value取m时,会得到最接近target的和
        // 因为[i,size-1]都会变成m,且最接近target,因为是四舍五入得到的m。
        // 如果arr[i]<m, 则对target进行更新target=target-arr[i],然后对剩余[i+1,size-1]进行上述操作,直到结束。
        // 注意如果循环结束都没有满足结束条件,那说明原数组和相加小于等于target,直接返回,数组最大值即可。
        // 时间复杂度是排序的用时O(nlogn).空间复杂度O(1).
        int len = arr.length;
        // 进行排序,可以减少循环次数
        Arrays.sort(arr);
        for (int i = 0; i < len; i++){
            // 对当前目标数target求size-i个元素的最接近平均整数
            double temp =(double) target/(len - i);
            int m = (int)temp;
            // 四舍五入
            if(temp-m-0.5>0)
                ++m;
            //如果最小值大于当前平均值
            if (temp < arr[i]) return m;
            else target -= arr[i];// 更新数据
        }
        return arr[len - 1];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值