【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;
    }
};
相关推荐
AI算法董同学2 分钟前
VS Code 配置 Anaconda Python 环境
开发语言·windows·vscode·python·编辑器
deephub10 分钟前
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
人工智能·python·机器学习·numpy·sklearn·特征工程
s_little_monster11 分钟前
【C++】继承(下)
开发语言·c++·经验分享·笔记·学习·学习方法
聪根大牛成长日记!14 分钟前
STL容器之----string的常见接口介绍及模拟实现部分接口(c++)
开发语言·c++
GISer Liu16 分钟前
LeetCode从入门到超凡(四)深入浅出理解贪心算法
python·算法·leetcode·面试·职场和发展·贪心算法·datawhale
这是我5830 分钟前
C++黑暗迷宫
c++·其他·游戏·visual studio·随机·迷宫·黑暗
Mephisto.java30 分钟前
【力扣 | SQL题 | 每日三题】力扣1148, 1327, 1211, 1174
数据库·sql·leetcode
多多*33 分钟前
OJ在线评测系统 前端开发整合开源组件 Monaco Editor 并且开发创建题目页面
服务器·前端·javascript·数据库·算法·开源
Lily_Mei39 分钟前
力扣高频 SQL 50 题(基础版)|分析、题解
sql·leetcode
音符犹如代码40 分钟前
第十四届蓝桥杯真题Python c组D.平均(持续更新)
python·蓝桥杯