0
点赞
收藏
分享

微信扫一扫

力扣53-最大子数组和问题-python

蚁族的乐土 2022-01-28 阅读 60

新手小白,请多指教,发文章也是为了留档

题目描述:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分

思路:用动态规划的方法,依次求出经过某一个数的最大值。假设我们输入的是[1,-2,3,4],

我们用dp[i]表示以nums[i]结尾的连续子数组的最大值

当i=0时,nums[0]=1,dp[0]=1

当i=1,nums[1]=-2,如果用nums[0]+nums[1]=-1,则最大值就是-1,dp[1]=-1

当i=2,nums[2]=3,此时如果加上第二步就会使总数变小,因为第二步的值<0,那我们就舍弃,也就是说到了第三步时,只取本身这个值时是最大的,dp[2]=3,

当i=3,nums[3]=4,由于第三步的值>0,所以我们加上,dp[3]=3+4=7

综上,我们每一步,取的都是最大值,可以发现,

当dp[i-1]<0,dp[i]=nums[i],

当dp[i-1]>0,dp[i]=dp[i-1]+nums[i]

这也就是我们的递归式。下面就是我的代码啦,如果直接用会在力扣上跑不出来,需要删改一下

nums = input()
nums = nums.split(",")
nums = [int(nums[i]) for i in range(len(nums))]  # 将nums里面的数据转换成整形
dp = [0 for i in range(len(nums))]  
dp[0] = nums[0]
if len(nums) == 0:
    print(0)
for i in range(1,len(nums)):
    if dp[i-1] >= 0:
        dp[i] = dp[i-1]+nums[i]
    else:
        dp[i] = nums[i]
print(max(dp))

当然 if那块可以优化,用一个dp[i]=max(dp[i-1]+nums[i],nums[i])也行,我就不多说啦

举报

相关推荐

0 条评论