(分治算法3)leecode 53 最大子数组和(最大子段和)

题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

分治解法

这个问题可以分成从左半边数组找最大子段和从右半部分找最大子段和。

对于跨越两个数组的情况,我们可以从中间一定要包含左边界的数字或者右边界的数字,只需要一次遍历就可以了。

java 复制代码
class Solution {
    public class Status {
        public int lSum, rSum, mSum, iSum;

        public Status(int lSum, int rSum, int mSum, int iSum) {
            this.lSum = lSum;
            this.rSum = rSum;
            this.mSum = mSum;
            this.iSum = iSum;
        }
    }

    public int maxSubArray(int[] nums) {
        return getInfo(nums, 0, nums.length - 1).mSum;
    }

    public Status getInfo(int[] a, int l, int r) {
        if (l == r) {
            return new Status(a[l], a[l], a[l], a[l]);
        }
        int m = (l + r) >> 1;
        Status lSub = getInfo(a, l, m);
        Status rSub = getInfo(a, m + 1, r);
        return pushUp(lSub, rSub);
    }

    public Status pushUp(Status l, Status r) {
        int iSum = l.iSum + r.iSum;
        int lSum = Math.max(l.lSum, l.iSum + r.lSum);
        int rSum = Math.max(r.rSum, r.iSum + l.rSum);
        int mSum = Math.max(Math.max(l.mSum, r.mSum), l.rSum + r.lSum);
        return new Status(lSum, rSum, mSum, iSum);
    }
}
相关推荐
高洁011 分钟前
基于Tensorflow库的RNN模型预测实战
人工智能·python·算法·机器学习·django
严文文-Chris1 分钟前
RAG关键技术要点详解
java·服务器·前端
一起养小猫3 分钟前
LeetCode100天Day5-最小长度子数组与三数之和
算法·leetcode·职场和发展
良木生香4 分钟前
【数据结构-初阶】顺序表相关习题
数据结构
❀͜͡傀儡师5 分钟前
基于docker一键部署 x86的cpu_mem_hog 用于生成CPU和内存负载,用于服务器cpu和内存使用不达标的
java·服务器·docker
小龙报5 分钟前
【初阶数据结构】从 “数组升级” 到工程实现:动态顺序表实现框架的硬核拆解指南
c语言·数据结构·c++·算法·机器学习·信息与通信·visual studio
蜡笔大新7987 分钟前
IO流的认识(2)
java·ide·intellij-idea
多米Domi01110 分钟前
0x3f第九天复习(考研日)(10.57-14:00)
python·算法
廋到被风吹走17 分钟前
【Java】【JVM】OOM 原因、定位与解决方案
java·开发语言·jvm
byzh_rc18 分钟前
[模式识别-从入门到入土] 拓展-EM算法
算法·机器学习·概率论