【LeetCode】410. 分割数组的最大值

本文介绍了一个算法问题——如何将一个非负整数数组分割成m个连续子数组,使这些子数组的和的最大值达到最小。通过二分查找的方法,找到最佳分割点,实现对数组的有效分割。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

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

示例 1:

输入:nums = [7,2,5,10,8], m = 2
输出:18
解释:
一共有四种方法将 nums 分割为 2 个子数组。
其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/split-array-largest-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number[]} nums
 * @param {number} m
 * @return {number}
 */
var splitArray = function(nums, m) {
  let max = 0, sum = 0
  for (let i = nums.length; i--;) {
    max = Math.max(nums[i], max)
    sum += nums[i]
  }
  let left = max, right = sum
  while (left < right) {
    // 子数组最大值
    const mid = Math.floor(left + (right - left) / 2)
    // 说明子数组最大值较小,需要增加mid的值,故left需右移
    if (splits(nums, mid) > m) {
      left = mid + 1
    } else {
      right = mid
    }
  }
  return right
};

/**
 * 切割数组数
 * @param {number[]} nums
 * @param {number} mid
 */
var splits = function(nums, mid) {
  let split = 1, c = 0
  for (let i = 0; i < nums.length; i++) {
    // 当前子数组和大于子数组最大值,切割数组数+1
    if (c + nums[i] > mid) {
      c = 0
      split++
    }
    c += nums[i]
  }
  return split
}

总结

二分查找的具体应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值