LeetCode 53. 最大子数组和

链接:53. 最大子数组和 - 力扣(LeetCode)

题目描述:

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

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

思想:动态规划

动态规划五部曲

1.确定np数组的含义

np[i] 保存的是以下标为 i 为结尾的,最大子数和

2.确定递推公式:

np[i] = max(np[ i-1 ] + nums[ i ] , nums[ i ]) 

以下标 i 为结尾,也就是以nums[ i ]为结尾的最大子序列和有两种情况,两者取最大值

  • 一种是以下标 i-1 结尾,也就是以nums[ i -1 ]结尾的子序列和加上当前值nums[i]
  • 一种是nums[ i ]自己本身
3.dp数组初始化 :

dp[0] = nums[0]

dp[0]意思是以0为下标的最大子数组和,保存的就是nums[0]本身

4.遍历np数组:

本题遍历顺序为从前往后,因为求最大值所以每次存np[i]的最大值

5.返回:

此处返回的是np数组中最大值

示例:nums = [-2,1,-3,4,-1,2,1,-5,4]

nums数组
下标012345678
-21-34-121-54

相对应np数组:

np数组
下标012345678
-21-2435615

python代码:

class Solution(object):
    def maxSubArray(self, nums):
        np = [0]*len(nums)
        # 初始化np数组
        np[0] = nums[0]
        # 初始化最大和为第一个元素
        len_t = nums[0]
        # 从第2个元素开始遍历,因为已初始化最大和为第一个元素
        for i in range(1,len(nums)):
            # 递推公式
            np[i] = max(np[i-1]+nums[i],nums[i])
            # 每次保存np数组中最大的数,即为最大连续子数组和
            len_t = max(len_t,np[i])
        return len_t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值