【面试系列】分割数组的最大值

题意:
原题链接

思路:
通常来说,求最小值的最大和最大值最小这种问题,基本思路都是二分答案。
二分答案,进行判断是否合法来更新二分区间即可。

这里 c h e c k check check函数贪心地选取子数组,我们会传入一个当前二分的答案 m a x max max
只要我们的选取的连续子数组的和不超过 m a x max max,那么就可以贪心的累加,这样对后面的分组不会造成额外的和导致其超过 m a x max max

代码:

class Solution {
    
    
public:
    int splitArray(vector<int>& nums, int m) {
    
    
        int n = nums.size();
        
        auto check = [&](int mx) {
    
    
            int i, j;
            for(i = 0, j = 0; i < n; ++i) {
    
    
                int sum = nums[i];
                while(i + 1 < n && sum + nums[i + 1] <= mx) {
    
    
                    sum += nums[i + 1];
                    i += 1;
                } j += 1; 
                //如果本轮过后已经分了超过m组,则就没必要继续分组了
            	if(j > m) return false;
            }
            return true;
        };
        
        int l = *max_element(nums.begin(), nums.end());
        int r = accumulate(nums.begin(), nums.end(), 0);
        while(l < r) {
    
    
            int mid = l + r >> 1;
            if(check(mid)) r = mid;
            else l = mid + 1;
        }
        return l;
    }
};

Guess you like

Origin blog.csdn.net/weixin_43900869/article/details/119763433