题解:
-
既然是要求最接近的,那么平均值肯定是最接近的,考虑到平均值可能存在小数,因此需要四舍五入,这样才会最接近。
-
如果数组中最大值也小于平均值,那么直接返回最大值。
-
直接从平均值开始找起,对每一个数求出其对应的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);
}
}