Python算法——求数组连续最大和

本文介绍了如何在Python中求解数组中连续子数组的最大和,包括蛮力法、优化方法和动态规划方法的分析及实现。动态规划方法在O(N)的时间复杂度内解决此问题,但会占用O(N)的空间。
摘要由CSDN通过智能技术生成

要求:

       一个有n个元素的数组,这n个元素既可以是正数也可以是负数,数组中连续的一个或多个元素组成一个连续的子数组,求子数组和的最大值。例如数组[1,-2,4,8,-4,7,-1,-5],其最大和的子数组为[4,8,-4,7],最大值为15。

分析:

       方法一:蛮力法

       找出所有的子数组,然后求出子数组的和,在所有子数组的和中取最大值。

       方法二:重复利用已经计算的子数组和

       由于sum[i,j]=sum[i,j-1]+arr[j],在计算sum[i,j]的时候可以使用前面已经计算出的sum[i,j-1]而不需要重新计算,采用这种方法可以省去sum[i,j-1]的时间,因此可以提高程序效率。

       方法三:动态规划方法

       首先根据数组的最后一个元素arr[n-1]与最大子数组的关系分为以下三种情况讨论:

      (1)最大子数组包含arr[n-1],即最大子数组以arr[n-1]结尾

      (2)arr[n-1]单独构成最大子数组

      (3)最大子数组不包含arr[n-1],那么求arr[1...n-1]的最大子数组可以转换为求arr[1...n-2]的最大子数组。

       通过上述分析可得:假设已经计算出子数组arr[1...i-2]的最大子数组和all[i-2],同时也计算出arr[0...i-1]中包含arr[i-1]的最大子数组和为end[i-1]。则可以得到如下关系:all[i-1]=max(end[i-1],arr[i-1],all[i-2])。

实现代码:

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值