Split Array Largest Sum

题目来源
给一个数组及一个整数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;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 原文出处:http://www.cnblogs.com/maybe2030/p/4715035.html引文出处:...
    明教de教主阅读 9,222评论 0 7
  • 分治策略 本文包括分治的基本概念二分查找快速排序归并排序找出伪币棋盘覆盖最大子数组 源码链接:https://gi...
    廖少少阅读 1,913评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • “ 他说“我多想 创造让你骄傲的辉煌” 他说“我也会努力变成自己想要的样子” 他说“我多想去一趟你的吉姆餐厅 和你...
    赵雷粉丝交流会阅读 536评论 0 0