410 Split Array Largest Sum 分割数组的最大值

Posted lina2014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了410 Split Array Largest Sum 分割数组的最大值相关的知识,希望对你有一定的参考价值。

给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
注意:
数组长度 n 满足以下条件:
    1 ≤ n ≤ 1000
    1 ≤ m ≤ min(50, n)
示例:
输入:
nums = [7,2,5,10,8]
m = 2
输出:
18
解释:
一共有四种方法将nums分割为2个子数组。
其中最好的方式是将其分为[7,2,5] 和 [10,8],
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。
详见:https://leetcode.com/problems/split-array-largest-sum/description/
C++:

class Solution {
public:
    int splitArray(vector<int>& nums, int m) {
        long long left = 0, right = 0;
        for (int i = 0; i < nums.size(); ++i)
        {
            left = max((int)left, nums[i]);
            right += nums[i];
        }
        while (left < right) 
        {
            long long mid = left + (right - left) / 2;
            if (can_split(nums, m, mid))
            {
                right = mid;
            }
            else
            {
                left = mid + 1;
            }
        }
        return left;
    }
    bool can_split(vector<int>& nums, int m, int sum) 
    {
        int cnt = 1, curSum = 0;
        for (int i = 0; i < nums.size(); ++i)
        {
            curSum += nums[i];
            if (curSum > sum) 
            {
                curSum = nums[i];
                ++cnt;
                if (cnt > m) 
                {
                    return false;
                }
            }
        }
        return true;
    }
};

 参考:https://www.cnblogs.com/grandyang/p/5933787.html

以上是关于410 Split Array Largest Sum 分割数组的最大值的主要内容,如果未能解决你的问题,请参考以下文章

410. Split Array Largest Sum

Leetcode410. Split Array Largest Sum

410. Split Array Largest Sum

410. Split Array Largest Sum

Split Array Largest Sum LT410

Leetcode 410. Split Array Largest Sum