LeetCode 410. 分割数组的最大值

一、题目

1、题目描述

给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k个非空的连续子数组。

设计一个算法使得这 k个子数组各自和的最大值最小。

2、接口描述

复制代码
cpp 复制代码
class Solution {
public:
    int splitArray(vector<int>& nums, int k) {
        
    }
};

3、原题链接

410. Split Array Largest Sum


二、解题报告

1、思路分析

看到"最大的最小"自然想到二分

那么关键就在于给定x,如何判断原数组是否能够划分为最大值不超过x的k个子数组

我们贪心地思考,如果原数组能够划分为最大值不超过x的j个子数组,j < k,那么一定也可以通过拆解某些子数组从而得到k个子数组

所以我们的check函数,遍历数组,贪心累加,如果sum > x,我们就cnt + 1,然后sum = x

最终取决于cnt <= k

很经典的二分+贪心的题目

2、复杂度

时间复杂度:O(n) 空间复杂度:O(1)

3、代码详解

复制代码
cpp 复制代码
class Solution {
public:
    int splitArray(vector<int>& nums, int k) {
       int r = 0 , l = 0;
       for(auto x : nums) r += x , l = max(l , x);
       function<bool(int)> check = [&](int t)
       {
           int cnt = 1 , s = 0;
           for(auto x : nums){
                if(s + x > t)
                    s = x , cnt++;
                else
                    s += x;
           }
            return cnt <= k;
       };
       while(l < r)
       {
           int mid = (l + r) >> 1;
           if(check(mid)) r = mid;
            else l = mid + 1;
       }
       return r;
    }
};
相关推荐
娅娅梨几秒前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
DdddJMs__1353 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
兵哥工控5 分钟前
MFC工控项目实例二十九主对话框调用子对话框设定参数值
c++·mfc
Fuxiao___7 分钟前
不使用递归的决策树生成算法
算法
我爱工作&工作love我12 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
娃娃丢没有坏心思42 分钟前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
lexusv8ls600h42 分钟前
探索 C++20:C++ 的新纪元
c++·c++20
lexusv8ls600h1 小时前
C++20 中最优雅的那个小特性 - Ranges
c++·c++20
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归