class Solution {
public:
int findBestValue(vector<int>& arr, int target) {
sort(arr.begin(), arr.end()); //排序
vector<int> presum(arr.size() + 1); //初始每個元素爲0
for (int i = 1; i <= arr.size(); i ++) presum[i] = presum[i - 1] + arr[i - 1]; //前綴和
int l = 1, r = arr[arr.size() - 1]; //(1,max)
while (l < r) {
int mid = l + r >> 1; // 分區間
getsum(arr, presum, mid) < target ? l = mid + 1 : r = mid;
}
return abs(getsum(arr, presum, l) - target) < abs(getsum(arr, presum, l - 1) - target) ? l : l - 1;
}
int getsum(vector<int>& arr, vector<int>& presum, int value) {
vector<int>::iterator iter = lower_bound(arr.begin(), arr.end(), value); //迭代器
int sum = presum[iter - arr.begin()] + (arr.end() - iter) * value; //前綴和 + value和
return sum;
}
};
leetcode六月每日一題 leetcode1300(二分查找法)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.