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

发布时间:2024年01月21日

LeetCode?启动!!!


今天是 hard,难受,还好有题解大哥的清晰讲解

题目:分割数组的最大值

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

题目描述

代码与解题思路

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

文章来源:https://blog.csdn.net/Locky136/article/details/135729929
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。