新手小白,请多指教,发文章也是为了留档
题目描述:
给你一个整数数组 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])也行,我就不多说啦