leetcode410分割陣列的最大值(二分+貪心,困難)

zhangjiaji111發表於2020-11-20

在這裡插入圖片描述

class Solution {
public:
    int satisfy(vector<int> a, int n, int m);
    int splitArray(vector<int>& nums, int m) {
        //即找出一個整數,比它小的數字分組個數大於m,比它大的小於等於m,符合二分的思想,返回的是R
        //L初值取max(a)-1最好了,即不管分多少組都不滿足, R初值取sum(nums) ,無論分成多少組每組都小於等於R,這樣縮小的二分的範圍,避免特殊考慮
        //陣列劃分中貪心的思想是比較常見的,即每個元素儘量往前面的組中放
        //vector中沒有max, sum等函式
        int total = 0;
        for (int i = 0; i < nums.size(); i++){
            total += nums[i];
        }

        int max = nums[0];
        for (int i = 0; i < nums.size(); i++){
            if (nums[i] > max) max = nums[i];
        }

        int L = max - 1, R = total;
        while (L + 1 < R){
            int mid =  (R + L) / 2; //L + (R - L) / 2;
            if (satisfy(nums, mid, m)){  //m是組數,要傳參過去!!
                R = mid;
            }else{
                L = mid;
            }
        }
        return R; 
    }
};
int Solution::satisfy(vector<int> a, int mid, int m){ 
    //把每個元素儘量往左邊放,如果左邊的和大於等於則放到新的組裡面,貪心的思想
    //如果分成n組,則一定可以分成n+1組,n+2組等

    int group = 1;
    int group_sum = 0;
    for (int i = 0; i < a.size(); i++){
        group_sum += a[i];
        if (group_sum > mid){
            group++;
            group_sum = a[i]; //應該等於a[i] !!!而不是0
        }
    }
    return group <= m; 

  
}

相關文章