Split Array Largest Sum

2017-05-22  本文已影响29人  我叫胆小我喜欢小心

题目来源
给一个数组及一个整数m,求将数组分割成m块,使得这m块中最大的和最小。
我一开始没有理解好题目,以为是可以随机分成m组,但是实际上每个小组是连续的。
然后最小和肯定是位于最大元素和数组和之间的,然后进行二分,每次判断是否可以分成m组小于mid的,假如可以,那么mid还可以更小,假如不行,mid必须加大。

class Solution {
public:
    int splitArray(vector<int>& nums, int m) {
        int maxNum = 0;
        long long sum = 0;
        for (auto num : nums) {
            sum += num;
            maxNum = max(maxNum, num);
        }
        long long l = maxNum, r = sum;
        while (l <= r) {
            long long mid = (l + r) / 2;
            if (valid(mid, nums, m))
                r = mid - 1;
            else
                l = mid + 1;
        }
        return l;
    }
    
    bool valid(int target, vector<int>& nums, int m)
    {
        int count = 1;
        long long total = 0;
        for (auto num : nums) {
            total += num;
            if (total > target) {
                total = num;
                count++;
                if (count > m)
                    return false;
            }
        }
        return true;
    }
};
上一篇下一篇

猜你喜欢

热点阅读