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;
    }
};
相关推荐
River4161 小时前
Javer 学 c++(十三):引用篇
c++·后端
感哥4 小时前
C++ std::set
c++
Fanxt_Ja5 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下5 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶5 小时前
算法 --- 字符串
算法
博笙困了5 小时前
AcWing学习——差分
c++·算法
NAGNIP5 小时前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP5 小时前
大模型微调框架之LLaMA Factory
算法
echoarts5 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客5 小时前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法