1.转变数组后最接近目标值的数组和
给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。
如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。
请注意,答案不一定是 arr 中的数字。
示例 1:
输入:arr = [4,9,3], target = 10
输出:3
解释:当选择 value 为 3 时,数组会变成 [3, 3, 3],和为 9 ,这是最接近 target 的方案。
示例 2:
输入:arr = [2,3,5], target = 10
输出:5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target
思路:
class Solution {
public int findBestValue(int[] arr, int target) {
int n = arr.length;
int avg = target / n;
// 记录前一轮的差值
int pre = Integer.MAX_VALUE;
int max = 0;
for (int i : arr) {
max = Math.max(i, max);
}
if (max < avg) {
return max;
}
// 从平均值开始遍历
for (int i = avg; ; ++i) {
// 记录每轮的总和
int sum = 0;
for (int value : arr) {
if (value > i) {
sum += i;
} else {
sum += value;
}
}
// 比较差值,看前一个点是否是最小值
if (Math.abs(sum - target) >= pre) {
return i - 1;
}
// 更新差值记录
pre = Math.abs(sum - target);
}
}
}
京公网安备 11010502036488号