1300. 转变数组后最接近目标值的数组和
目录
- 题目
- 解法
题目
给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。
如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。
请注意,答案不一定是 arr 中的数字。
解法
class Solution {
public:
int check(const vector<int>& arr, int x) {
int ret = 0;
for (const int& num: arr) {
ret += (num >= x ? x : num);
}
return ret;
}
int findBestValue(vector<int>& arr, int target) {
sort(arr.begin(), arr.end());
int n = arr.size();
vector<int> prefix(n + 1);
for (int i = 1; i <= n; ++i) {
prefix[i] = prefix[i - 1] + arr[i - 1];
}
int l = 0, r = *max_element(arr.begin(), arr.end()), ans = -1;
while (l <= r) {
int mid = (l + r) / 2;
auto iter = lower_bound(arr.begin(), arr.end(), mid);
int cur = prefix[iter - arr.begin()] + (arr.end() - iter) * mid;
if (cur <= target) {
ans = mid;
l = mid + 1;
}
else {
r = mid - 1;
}
}
int choose_small = check(arr, ans);
int choose_big = check(arr, ans + 1);
return abs(choose_small - target) <= abs(choose_big - target) ? ans : ans + 1;
}
};