给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。
如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。
思路参考tinylife的python版本
1、当数组的和小于等于target时,无论选取哪个元素作为value,更新后的和都不会大于target,因此,选取最大的元素,将会得到最贴近的差值。
2、value不会小于target/len(array),否则sum会始终小于target。
class Solution {
public:
int findBestValue(vector<int>& arr, int target) {
int sum = 0;
for(int i=0;i<arr.size();i++){
sum += arr[i];
}
if(sum<=target){
vector<int>::iterator maxp = max_element(arr.begin(),arr.end());
return *maxp;
}
int avg = target/arr.size();
sum = avg*arr.size();
int update = 0;
while(sum<target){
update = sum;
sum = 0;
for(int i=0;i<arr.size();i++){
if(avg>arr[i]){
sum += arr[i];
}
else{
sum += avg;
}
}
avg++;
}
if(abs(target-sum)>=abs(target-update)){//绝对值最接近target
return avg-2;
}
else{
return avg-1;
}
}
};