JZ30 连续子数组的最大和

题目陈述

题目大意:给定一个有正数有负数的数组,求解连续的一段的元素的和的最大值

算法1:暴力做法

算法思路

  • 枚举左右端点,然后计算这个区间的总和now,跟ans比较,如果比ans大,则更新ans,最后循环结束返回ans
  • 时间复杂度 O ( n 3 ) O(n^3) O(n3),空间复杂度 O ( 1 ) O(1) O(1)

代码实现

class Solution
{
public:
    int FindGreatestSumOfSubArray(vector<int> array)
    {
        int ans = INT_MIN;
        int len = array.size();
        for (int i = 0; i < len; i++)//枚举左端点
        {
            for (int j = i; j < len; j++)//枚举右端
            {
                int now = 0;
                for (int k = i; k <= j; k++)//计算区间和
                {
                    now += array[k];
                }
                ans = max(now, ans);//更新ans
            }
        }
        return ans;
    }
};

算法2:前缀和优化

算法思路

  • 我们发现上面的过程中,会重复计算很多的子区间的总和,所以我们用前缀和优化,
  • 第一个数到第j个数的和,减去第一个数到第i-1个数的和,即得到第i个数到第j个数的和,即 s u m [ 1 , j ] − s u m [ 1 , i − 1 ] = = s u m [ i , j ] sum[1,j]-sum[1,i-1]==sum[i,j] sum[1,j]sum[1,i1]==sum[i,j]
  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( n ) O(n) O(n)(因为定义了一个sum数组)

代码实现

class Solution{
public:
    int FindGreatestSumOfSubArray(vector<int> array)
    {
        
        int ans=INT_MIN;
        int len = array.size();
        vector<int> sum(len+1,0);
        //sum[0]设为空集,
        //sum[i+1]设为array[0,i]的和,其中i=0~len-1
        //约定array[-1]==0为空集
        for(int i=0;i<len;i++){
            sum[i+1]=sum[i]+array[i];//计算前缀和
        }

        for (int i = 0; i < len; i++)//约定array[-1]==0为空集
        {
            for (int j = i+1; j <= len; j++)
            {
                ans=max(ans,sum[j]-sum[i]);//计算[i-1,j-1]的和
            }
        }
        return ans;
    };
};

算法3:动态规划

算法思路

  • 设dp[n]为以第n个数为结尾,得到的子数组的和的最大值
  • 因为以第n个数为结尾所以array[n]是必然被选择的
  • 基于dp[n-1]的值,如果dp[n-1]>0,我们加上这个正数,我们的值是不是必然会增大
  • 如果dp[n-1]<0,那么我们加上负数,我们的值就会减小,这个时候我们不如不要前面的结果,只要当前这个数,结果反而更优
  • 于是我们就得到了状态转移方程dp[n]=array[n]+(dp[n-1]>0?dp[n-1]:0),实时跟ans比较,更新最大值即可
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)(定义了一个dp数组)

优化算法(空间复杂度)

  • 我们可以发现当前状态只跟上一个状态有关,所以我们可以只用一个int来代替dp数组,即num
  • 如果num<0,那么这个时候就num=array[i]
  • 如果num>0,那么就num=num+array[i]
  • 然后实时跟ans比较,更新最大值即可
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

动画演示

在这里插入图片描述

代码实现

C++
class Solution
{
public:
    int FindGreatestSumOfSubArray(vector<int> array)
    {
        int now, ans;
        now = 0, ans = INT_MIN;
        for (int i = 0; i < array.size(); i++)
        {
            if (now < 0)
                now = array[i];
            else
            {
                now += array[i];
            }
            ans = max(now, ans);
        }
        return ans;
    }
};
python

class Solution:
    def FindGreatestSumOfSubArray(self, array):
        now=0
        ans=-1000000000
        for i in array:#此处i即代表array里面的第i个元素的值
            if now<0 :
                now=i#now<0,则舍去前面的
            else :
                now+=i
            ans=max(ans,now)#更新ans
        return ans 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
08-10
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值