dp - #连续子数组的最大和#

描述
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
数据范围:
1 <= n <= 2\times10^51<=n<=2×10
5

-100 <= a[i] <= 100−100<=a[i]<=100

要求:时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)
进阶:时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1)
解题思路:

  1. 这道题可以考虑使用动态规划来解决,为什么呢?
  2. 动态规划:最优子结构和重叠子问题。对于这道题来说,这两个性质都是满足的,首先大问题的最优解包含着小问题的最优解,然后子问题是大问题的小版本。
  3. 开辟一个dp列表用来实现状态转移方程
  4. res最开始为列表的第一个元素,如果列表只有一个元素,返回就是了
  5. 以[1,-2,3,10,-4,7,2,-5]为例:dp[2] = max(array[1], dp[1]+array[1])
  6. 解读:dp[1] = max(array[0], dp[0]+array[0]) = 1
  7. dp[2] = max(array[1], dp[1]+array[1]) -》 dp[2] = max(-2, -1) = -1
  8. 对于dp[3]来说,max(3, 3-1)肯定选3
  9. 对于dp[4]来说,max(10, 10 +13)肯定选13
  10. dp的值:[0, 1, -1, 3, 13, 9, 16, 18, 13]
  11. dp数组是游离于array数组之外,他只是用来记录子数组的值累加的过程中能够取得的最大值
12.想不明白的点刷了个抖音想明白了。。为什么这样一个状态转移方程,就能够取出某一部分的子数组来而不是连续的呢?[1,-2,3,10,-4,7,2,-5],为什么从3开始的子数组,1和-2呢?原因就在这一句:max(array[i-1], dp[i-1]+array[i-1]),如果是连续的子数组那么会取到这个dp[i-1]+array[i-1],否则选用array[i-1]就斩断了,比如到3的时候,dp+array还不如array大,那么就从这个地方砍断,以array为起始继续往后面走!
  1. 感觉这个说到底还是和dp的无后效性有关,“未来与过去无关”、“过去不影响未来”,dp[i]只会关心dp[i-1],至于dp[i-2]、dp[i-3].。。。who care?
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param array int整型一维数组 
# @return int整型
#
class Solution:
    def FindGreatestSumOfSubArray(self , array: List[int]) -> int:
        # write code here
        dp = [0 for i in range(len(array)+1)]
        res = array[0]
        for i in range(1, len(array)+1):
            dp[i] = max(array[i-1], dp[i-1]+array[i-1])
            res = max(res, dp[i])
        return res
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值