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); } } }