【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;
    }
};
相关推荐
Billlly1 分钟前
莫比乌斯反演学习笔记
算法
装不满的克莱因瓶5 分钟前
使用 PyTorch Tensor 的相关数据处理
人工智能·pytorch·python·深度学习·机器学习·ai
如烟花的信页15 分钟前
易盾点选逆向分析
javascript·爬虫·python·js逆向
fqbqrr19 分钟前
2606C++,方便的调试类
c++
我不是懒洋洋25 分钟前
从零实现一个RPC框架:远程调用与服务治理
c++
金銀銅鐵26 分钟前
用 Tkinter 实现一个简单的罗马数字转化工具
后端·python
困意少年38 分钟前
从统一初始化到移动语义:C++11 为什么是现代 C++ 的起点
c++
ckjoker42 分钟前
四大AI Agent架构拆解:我手敲了一个迷你版,发现了7条可迁移的设计原则
python·agent
小二·43 分钟前
Python 异步编程深度解析:Async/Await 实战
网络·python·github
stolentime1 小时前
CF2066D1 Club of Young Aircraft Builders (easy version)题解
c++·算法·动态规划·组合数学