leetcode六月每日一題 leetcode1300(二分查找法)

在這裏插入圖片描述

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章