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];
}
}
1300. 转变数组后最接近目标值的数组和(逐句解释代码)
最新推荐文章于 2022-07-29 17:05:58 发布