二分法解最小化【數組分段和】問題

class Solution {
public:
    int getNum(vector<int>& time, int vol) {
        int res = 1;
        int Sum = 0;
        int Max = 0;
        for (int i = 0; i < time.size(); i++) {
            if (time[i] > Max) {
                Sum += Max;
                Max = time[i];
            }
            else {
                Sum += time[i];
            }
            if (Sum > vol) {
                res++;
                Sum = 0;
                Max = time[i];
            }
        }
        return res;
    }
    
    int minTime(vector<int>& time, int m) {
        int n = time.size();
        if (!n) {
            return 0;
        }
        int Sum = 0;
        int Max = 0;
        for (int i = 0; i < n; i++) {
            Sum += time[i];
            Max = max(Max, time[i]);
        }
        int low = 0;
        int high = Sum - Max;
        while (low < high) {
            int mid = (low + high) / 2;
            int res = getNum(time, mid);
            if (res > m) {
                low = mid + 1;
            }
            else {
                high = mid;
            }
        }
        return low;
    }
};

References

  1. 數組分段和最大值最小問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章