leetcode hot100刷题日记——7.最大子数组和

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        //方法一:动态规划
        //dp[i]表示以i下标结尾的数组的最大子数组和
        //那么在i=0时,dp[0]=nums[0]
        //之后要考虑的就是我们要不要把下一个数加进来,如果下一个数加进来会使结果变大那就加进来
        //但要是下一个数加进来之后,还不如这个数单独大,那我们就舍弃前面的子数组和,直接用单独这个数,即:
        //dp[i]=max(dp[i-1]+nums[i],nums[i])
        //什么情况下"下一个数加进来之后,还不如这个数单独大"?
        //dp[i-1]为负数的时候
        // int n=nums.size();
        // vector<int>dp(n);
        // dp[0]=nums[0];
        // int maxx=nums[0];
        // for(int i=1;i<n;i++){
        //     dp[i]=max(dp[i-1],0)+nums[i];
        //     maxx=max(dp[i],maxx);
        // }
        // return maxx;

    //方法2:前缀和+贪心
    //最大子数组和=max(所有当前前缀和-最小前缀和)
    //为什么只需要维护最小前缀和呢?
    //因为最大子数组和这个问题要看的是连续部分!
    //你如果求最大前缀和-最小前缀和
    //那么有可能最大前缀和比最小前缀和短!
    //eg. 5 4 3 -2 -1 -5
    //最大前缀和是5+4+3=12
    //最小前缀和是5+4+3-2-1-5=4
    //最大前缀和-最小前缀和=8
    //但是不对啊!实际上最大子数组和是5+4+3=12啊!
    //所以最小前缀和初始化值为0
    int n=nums.size();
    if(n==1)
        return nums[0];
    int ans=INT_MIN;
    int minn=0;
    int sum=0;
    for(int i=0;i<n;i++){
        sum+=nums[i];
        ans=max(ans,sum-minn);
        minn=min(minn,sum);
    }
    return ans;

    }
};

时间复杂度:O(N)

空间复杂度:

方法一是O(N)

方法二是O(1)

相关推荐
机器人零零壹13 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
布莱克60514 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
ZhengEnCi16 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是16 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考17 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
沫璃染墨19 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
nm_zfyjt19 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
xiaoye-duck20 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
w_zero_one20 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼21 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php