当前位置: 首页 > news >正文

LeetCode 410 - 分割数组的最大值 - 实践

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码详解:
    • 示例测试及结果
      • 运行结果:
      • 解释:
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

今天要聊的题是 LeetCode 410:分割数组的最大值(Split Array Largest Sum)
这题的核心是——如何在把数组拆成 k 段之后,让这些段的“最大和”尽可能小。

换句话说,这是一道非常经典的“二分 + 贪心”混合问题。看起来像是要枚举所有分法,但实际上我们可以通过“最大和上限”来二分搜索答案,找到最优解。

这类题在项目中也挺常见,比如你要把一批任务分配给 k 台服务器,每台机器的任务量不能太悬殊,我们就希望找到“最平衡”的那种分法。

描述

题目是这样说的:

给定一个非负整数数组 nums 和一个整数 k,我们需要把 nums 拆成 k 个非空连续子数组,使得这 k 个子数组的“和的最大值”尽量小。

返回这个最小的“最大和”。

比如:

输入:nums = [7,2,5,10,8], k = 2
输出:18

这里最优的拆法是 [7,2,5][10,8]
第一个子数组的和是 14,第二个是 18,所以“最大和”是 18。
而且这 18 是所有拆法中最小的可能值。

题解答案

这题的暴力解法显然行不通,因为所有拆法的组合太多了。
一个更聪明的思路是:
我们可以“假设”当前能接受的最大和是 x,然后去判断能不能把数组拆成 ≤ k 段,使得每段的和都 ≤ x

如果能做到,那说明 x 还可以更小;
如果做不到,那说明 x 太小了,得放宽。

这样我们就能用“二分法”去搜索最小可行的 x
听起来像 DP,但其实用贪心就能实现判断逻辑。

题解代码分析

下面是完整的 Swift 代码,可以直接在 LeetCode Playground 或 Xcode 里运行:

import Foundation
class Solution {
func splitArray(_ nums: [Int], _ k: Int) -> Int {
var left = nums.max() ?? 0   // 下界:至少要能装得下最大的单个元素
var right = nums.reduce(0, +) // 上界:所有元素相加(全部不拆的情况)
var result = right
// 二分查找最小的“最大子数组和”
while left <= right {
let mid = (left + right) / 2
if canSplit(nums, k, mid) {
result = mid
right = mid - 1 // 尝试更小的上限
} else {
left = mid + 1 // 当前上限太小,不够装
}
}
return result
}
// 判断能否用 <= k 段来满足“每段和 ≤ maxSum”
private func canSplit(_ nums: [Int], _ k: Int, _ maxSum: Int) -> Bool {
var count = 1
var currentSum = 0
for num in nums {
if currentSum + num > maxSum {
// 需要新开一段
count += 1
currentSum = num
if count > k { return false } // 拆的段太多了,不行
} else {
currentSum += num
}
}
return true
}
}

代码详解:

  1. 边界初始化:

    • left 设为 nums 中的最大值(任何分法都得能装下最大的元素)。
    • right 是数组总和(最极端的情况:不拆分)。
  2. 二分搜索逻辑:

    • 每次取 mid 作为当前假设的“最大和上限”。
    • 调用 canSplit() 判断在这个上限下能不能拆成 k 段。
    • 如果能,那我们试试看更小的上限;
    • 如果不能,那说明这上限太紧,得放大。
  3. canSplit 函数:
    用一个简单的贪心法,从左到右累加,一旦超出 maxSum 就“另开一段”。
    如果段数超过 k,说明当前上限不行。

这段代码思路非常简洁,逻辑清晰,不需要 DP 就能在 O(n log(sum)) 的时间内完成判断。

示例测试及结果

我们来手动测试几个例子。

let solution = Solution()
print(solution.splitArray([7,2,5,10,8], 2))  // 输出: 18
print(solution.splitArray([1,2,3,4,5], 2))   // 输出: 9
print(solution.splitArray([1,4,4], 3))       // 输出: 4

运行结果:

18
9
4

解释:

  • [7,2,5,10,8] 拆成 [7,2,5] + [10,8],最大和为 18;
  • [1,2,3,4,5] 最优拆法是 [1,2,3] + [4,5],最大和 9;
  • [1,4,4] 拆成 [1], [4], [4],每段最大和是 4。

这些结果完全符合预期。

时间复杂度

综合下来,总复杂度是:

O(n · log(sum(nums)))

这个效率非常不错,即便 nums 长度是 1000,也能轻松通过。

空间复杂度

代码里没有使用额外的数据结构,除了常数级变量。

空间复杂度:O(1)

所以非常节省内存。

总结

这题最重要的突破点是:不要硬拆数组,而是去猜“最大和”是多少。
通过“二分 + 贪心”,我们把一个原本爆炸级复杂的枚举问题,变成了一个可以稳定在 O(n log(sum)) 的算法。

在实际开发中,这种思路也很常见。比如:

这些都可以类比成“分割数组的最大值”问题。

如果你掌握了这种“从目标值反推结构”的思维方式,以后再遇到类似“最小化最大值”或“最大化最小值”的题,基本都能用二分思路搞定。

http://www.jsqmd.com/news/51360/

相关文章:

  • 2025年11月高新技术企业认定公司推荐:榜单分析与选择指南
  • 2025年11月数据标注平台推荐选择指南:基于实际需求的技术路线与成本考量
  • 2025 最新硫化仪厂家推荐排行榜:无转子 / 橡胶 / 门尼粘度仪硫化仪实力厂家技术与售后测评
  • 2025年11月取暖器品牌推荐选择指南:专业分析维度助力家庭精准决策
  • 109_尚硅谷_函数介绍和应用案例
  • 2025 年 11 月羽绒服厂家精选推荐榜:薄款/厚款/男款/女款/可水洗/复古款/潮流/街头风/休闲/运动/通勤/百搭,时尚设计与实用功能兼具的冬日穿搭首选
  • 2025年11月高新技术企业认定公司推荐:知名榜单与选择指南
  • 2025年厚壁钢管生产商权威推荐榜单:钢板卷钢管/非标钢管/不锈钢管源头厂家精选
  • AIGC降重指令全攻略:10个高效技巧助你论文快速过审
  • 2025年11月沈阳酒店推荐深度解析:核心价值点与专业维度评估
  • 2025 成型机厂家最新推荐排行榜:冷弯 / 粉末 / 光伏配套 / 门业设备权威榜单,源头厂家实力优选指南C 型槽 / 轻钢龙骨 / 电缆桥架 / 圆管成型机推荐
  • Linux写文件到windows共享文件夹
  • 基于维纳滤波器的语音去噪Matlab实现
  • 2025 年 11 月棒球帽品牌实力推荐榜:薄款厚款男女款可水洗,潮流百搭防晒抗皱,街头风复古甜美帅气款精选合集
  • 2025草本洗发水最新top5榜单公布,行业权威数据及市场口碑推荐,防脱/止痒/无硅油/控油/深层滋养/平价/温和洁净/敏感头皮可用品牌及选择指南
  • 2025 年 11 月羽绒服厂家潮流推荐榜:薄款/厚款/男女新款,可水洗/抗皱/百搭设计,涵盖简约/复古/街头风/甜美/帅气多元风格,小红书热门潮牌精选
  • 2025年11月幼猫罐头产品推荐热度榜:基于性能指标的结果承诺保障方案
  • 2025厦门留学机构有哪些地方
  • 2025留学中介十大
  • 2025年11月幼猫罐头产品推荐对比分析:三大阵营专业维度深度评测报告
  • 2025广州的留学机构有哪些公司
  • 2025北京的留学机构排名一览表
  • 2025年郑州享标体方案服务商权威推荐榜单:郑州瘦身加盟渠道/郑州身材管理平台/郑州减肥加盟服务商精选
  • 2025年11月猫罐头产品品牌推荐权威榜单:十大品牌核心价值与解决方案解析
  • 2025年11月高新技术企业认定公司推荐:权威榜单与选择指南
  • 2025年11月猫罐头产品品牌推荐选择指南:专业分析维度助力企业精准决策
  • 2025年11月猫罐头产品品牌推荐评测报告:从配方科学到适口性解决方案剖析
  • 2025年11月审计报告事务所推荐:一份权威榜单与选择指南
  • 2025年11月岗亭定制厂家推荐榜单:全国连锁模块化空间专家权威评测
  • 2025年11月岗亭定制厂家推荐榜单:全国连锁模块化空间专家法利莱集团深度评测