最大子数组和 动态规划
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
思路:
开门见山:这里要用到动态规划。
一般涉及到“子数组”这种问题的,大多用动态规划,见过一次就知道啦。
定义一个数组dp[],dp[i]表示在以i位置结尾的子数组的最大值。注意这里又是定义成了以i结尾的什么什么,这也是动态规划数组非常常见的定义形式:关键点是以XX结尾。
直接上状态转移方程:dp[i]=max(dp[i-1]+nums[i],nums[i])
如对于nums = [5,4,-1,7,8]来说,dp[0]只能是num[0];dp[1]要么是dp[0]+num[1]要么是num[1];dp[2]要么就直接是num[2]自己,要么就是num[2]+dp[1]。其实原理就是:求dp[i]时,如果dp[i-1]>0,则它们就可以连起来以达到使dp[i]最大。
那么最终,dp数组中的最大值,就是整个数组中具有最大和的连续子数组的和。
代码:
class Solution(object):
def maxSubArray(self, nums):
lenth = len(nums)
dp = [0]*lenth
dp[0]=nums[0]
for i in range(1,lenth):
dp[i]=max(dp[i-1]+nums[i],nums[i])#要么自己,要么看看前一个凑的和自己加起来
return max(dp)
小结:
遇到“子数组”题,我们就先往动态规划上面去想。第一次做这个题的时候想不出来很正常,我依然认为力扣有时就像脑筋急转弯,知道过思路之后,再次见到就可以“条件反射”到动态规划了。
总之这道题是简单而经典的动态规划题~拿来练习动态规划的不错选择。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了