【LeetCode】每日一题:最大子数组和

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

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

解题思路

要注意最小值是整个前缀,主要是cumsum然后按照买卖股票的思路做的,但是边界处理很容易错,可以以最开始几个边界来判定初始值,这个方法挺好用的。

AC代码

python 复制代码
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        minres = 0
        res = -inf
        pre = 0
        for index in range(len(nums)):
            pre += nums[index]
            res = max(res, pre - minres)
            minres = min(minres, pre)
        return res

官方思路

动态规划

注意动态规划的重点是以i结尾的最大子串,只有加上结尾这个条件才能写递归式。

我们需要两个变量,一个变量用来记录上一个递归结果,其应该为单独上一个数或者上一个数加上前面一段。这里的变量逻辑和cumsum的前缀和逻辑是有区别的。

python 复制代码
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res = nums[0]
        pre = 0
        for n in nums:
            pre = max(pre + n, n)
            res = max(res, pre)
        return res

二分法

线段树的思想,第一次看到,需要维护四个变量,分辨是非左端点最大值,有点点最大值,整区间值和区间内最大值,这个思路其实像是多道二分法题目的合并了,这种做法的好处在于可以存储任意区间的结果。如果需要多次输出结果,这种方法的优势就比较明显了。

cpp 复制代码
class Solution {
public:
    struct Status {
        int lSum, rSum, mSum, iSum;
    };

    Status pushUp(Status l, Status r) {
        int iSum = l.iSum + r.iSum;
        int lSum = max(l.lSum, l.iSum + r.lSum);
        int rSum = max(r.rSum, r.iSum + l.rSum);
        int mSum = max(max(l.mSum, r.mSum), l.rSum + r.lSum);
        return (Status) {lSum, rSum, mSum, iSum};
    };

    Status get(vector<int> &a, int l, int r) {
        if (l == r) {
            return (Status) {a[l], a[l], a[l], a[l]};
        }
        int m = (l + r) >> 1;
        Status lSub = get(a, l, m);
        Status rSub = get(a, m + 1, r);
        return pushUp(lSub, rSub);
    }

    int maxSubArray(vector<int>& nums) {
        return get(nums, 0, nums.size() - 1).mSum;
    }
};
相关推荐
trayvontang21 分钟前
Python虚拟环境与包管理工具(uv、Conda)
python·conda·uv·虚拟环境·miniconda·miniforge
伊织code24 分钟前
pdfminer.six
python·pdf·图片·提取·文本·pdfminer·pdfminer.six
楼田莉子27 分钟前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
hqxstudying1 小时前
JAVA项目中邮件发送功能
java·开发语言·python·邮件
Q_Q5110082851 小时前
python的软件工程与项目管理课程组学习系统
spring boot·python·django·flask·node.js·php·软件工程
pusue_the_sun1 小时前
数据结构——栈和队列oj练习
c语言·数据结构·算法··队列
大锦终1 小时前
【算法】模拟专题
c++·算法
方传旺2 小时前
C++17 std::optional 深拷贝 vs 引用:unordered_map 查询大对象性能对比
c++
合作小小程序员小小店2 小时前
SDN安全开发环境中常见的框架,工具,第三方库,mininet常见指令介绍
python·安全·生成对抗网络·网络安全·网络攻击模型
Dontla2 小时前
Makefile介绍(Makefile教程)(C/C++编译构建、自动化构建工具)
c语言·c++·自动化