Leetcode 1300

题解:

  1. 既然是要求最接近的,那么平均值肯定是最接近的,考虑到平均值可能存在小数,因此需要四舍五入,这样才会最接近。

  2. 如果数组中最大值也小于平均值,那么直接返回最大值。

  3. 直接从平均值开始找起,对每一个数求出其对应的sum并计算与target的差值,会是一个先减再增的过程,因为只有比value大的数才会变化,所以我们需要做的就是找到这个拐点。

package Leetcode;

public class Demo1300 {
    public  static int find(int [] arr ,int target){
        int len=arr.length;
        int avg=Math.round(target/len);
        int max=0;
        for (int i : arr) {
            max=Math.max(i,max);
        }
        if(max<avg) return max;
        int pre=Integer.MAX_VALUE;
        for (int i = avg;; i++) {
            int sum=0;
            for (int i1 : arr) {//遍历这个数组中值 比如 4 9  3  这个i1 就分别等于4 9 3
                sum+=Math.min(i1,i);
                /*这里的意思就是只要数组中比这个平均值大的数都不取
                计算的是总和  这个整体会呈现一个增加的态势 只要找到那个和target
                这个值差值最小的就是这个数  因为会多一循环 所以返回的是i-1
                * */
//                System.out.println(sum+"//");
            }
            if (Math.abs(sum-target)>=pre)
                return i-1;
            pre=Math.abs(sum-target);
        }
    }

    public static void main(String[] args) {
        int a[] ={4,9,2};
//        for (int i : a) {
//            System.out.println(i);
//        }
        int z=find(a,10);

        System.out.println(z);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值