【LeetCode】每日一题 2024_1_21 分割数组的最大值(二分)

文章目录

  • LeetCode?启动!!!
  • 题目:分割数组的最大值
    • 题目描述
    • 代码与解题思路

LeetCode?启动!!!

【LeetCode】每日一题 2024_1_21 分割数组的最大值(二分)_第1张图片
今天是 hard,难受,还好有题解大哥的清晰讲解

题目:分割数组的最大值

题目链接:410. 分割数组的最大值

题目描述

【LeetCode】每日一题 2024_1_21 分割数组的最大值(二分)_第2张图片

代码与解题思路

func splitArray(nums []int, k int) int {
    // max_nums 是 nums 中最大的一个数, sum_nums 是 nums 所有数的和
    max_nums, sum_nums := 0, 0
    for _, v := range nums {
        sum_nums += v
        max_nums = max(max_nums, v)
    }

    // 用二分思想猜出使用 k 个子数组的最大和
    left, right := max_nums, sum_nums
    for left < right {
        tmp, cnt, mid := 0, 0, (left+right)/2
        for _, v := range nums {
            tmp += v
            if tmp > mid { // 凑成子数组的最大和了, 计数++, tmp 从当前值重新开始计算
                cnt++
                tmp = v
            }
        }
        cnt++ // 加上最后的那个数组
        if cnt > k { // 达成最大和 mid 的子数组数量多了, 证明 mid 不够大
            left = mid + 1
        } else { // 达成最大和的子数组少了, 证明最大和要求太大, 需要变小一些
            right = mid
        }
    }
    return left
}

由题意可知,子数组的最大范围是 [max(nums), sum(nums)]

令 left = max_nums,right = sum_nums,mid = (left + right) / 2

计算数组和 mid 对应的子数组数量 cnt,直到找到与子数组 k 数量相匹配的最大数组和即可

当 cnt > k,就证明子数组划分多了,mid 偏小,令 left = mid + 1
当 cnt <= k,就证明子数组少了(或者刚刚好),令 right = mid

你可能感兴趣的:(LeetCode,每日一题,leetcode,算法,职场和发展)