返回子数组的最大累加和【刷题记录】

一、题目描述

给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5 , -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
[要求]
1、 时间复杂度为O(n),
2、空间复杂度为O(1)

示例:
输入:[1, -2, 3, 5, -2, 6, -1]
返回值:12

二、解题思路

1、定义一个dp大小为n的数组,其中dp[i]的值代表到第i位的时候,以arr[i]结尾的连续子数组最大累加和。
2、当i =0时,dp[i] = arr[0]
3、当i != 0时, dp[i] = max(0,dp[i-1]) + arr[i](若 dp[i-1] <= 0即为负数时时dp[i-1] + arr[i]还不如arr[i]的本身大,所以当dp[i-1] <= 0时,dp[i-1] = arr[i], 当dn[i-1] >0时,dp[i] = dp[i-1] + arr[i])
4、最后返回值为dp数组中最大的值
在这里插入图片描述

三、解题代码

class Solution:
    def maxsumofSubarray(self , arr ):
        # write code here
        dp = [0] * len(arr)#开辟dp
        res = arr[0]#保存最终的结果
        dp[0] = arr[0]#初始化
        for i in range(1,len(arr)):
            dp[i] = max(dp[i-1],0) + arr[i]#维护dp[i]
            res = max(res,dp[i])#每更新一个dp值就更新一下res
        return res
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值