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;
    }
};
相关推荐
碧海蓝天202214 分钟前
C++法则21:避免将#include放在命名空间内部。
开发语言·c++
CodeWithMe33 分钟前
【读书笔记】《C++ Software Design》第一章《The Art of Software Design》
开发语言·c++
卷福同学1 小时前
【AI编程】AI+高德MCP不到10分钟搞定上海三日游
人工智能·算法·程序员
mit6.8241 小时前
[Leetcode] 预处理 | 多叉树bfs | 格雷编码 | static_cast | 矩阵对角线
算法
皮卡蛋炒饭.2 小时前
数据结构—排序
数据结构·算法·排序算法
Tanecious.2 小时前
C++--红黑树
开发语言·c++
??tobenewyorker2 小时前
力扣打卡第23天 二叉搜索树中的众数
数据结构·算法·leetcode
贝塔西塔3 小时前
一文读懂动态规划:多种经典问题和思路
算法·leetcode·动态规划
众链网络3 小时前
AI进化论08:机器学习的崛起——数据和算法的“二人转”,AI“闷声发大财”
人工智能·算法·机器学习
3 小时前
Unity开发中常用的洗牌算法
java·算法·unity·游戏引擎·游戏开发