Split Array Largest Sum

weixin_34208283發表於2017-05-22

題目來源
給一個陣列及一個整數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;
    }
};

相關文章