【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;
    }
};
相关推荐
noipp4 小时前
推荐题目:洛谷 B2099 矩阵交换行
线性代数·算法·矩阵
今天AI了吗4 小时前
Hermes Agent 搭建全流程:从本机试跑到可持续运行的个人 AI Agent
java·人工智能·python·学习·embedding
是个西兰花4 小时前
Linux:深入解析Linux线程原理与实现
linux·运维·c++·线程·互斥锁
为啥全要学5 小时前
自注意力中随着根号dk的增大,qk点积的方差为什么也会增大
python·深度学习
来两个炸鸡腿6 小时前
【Datawhale2607】llm-algo-leetcode task02 基础算子
人工智能·python·大模型
五条凪6 小时前
简单理解 BM25 与 TF-IDF
人工智能·算法·搜索引擎·全文检索·tf-idf
小保CPP6 小时前
OCR C++ Tesseract基础用法
c++·人工智能·ocr·模式识别·光学字符识别
行者全栈架构师6 小时前
【码动四季】Spring Boot 可观测性体系:Micrometer + OpenTelemetry + Grafana 全链路搭建
java·算法·架构
庵中十三居士6 小时前
【纯AI无人工修改】AI Agent从0到1实战:50行Python手写核心循环,一次看懂所有Agent框架的底层逻辑
开发语言·人工智能·python
TCW11216 小时前
AI底层系列:用C++实现线性代数的公式推导与算法设计-8.线性变化(3)
c++·人工智能·算法