1、题目
https://leetcode-cn.com/problems/maximum-subarray/submissions/
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
2、实现-逆向动态规划
分析:
设sum[i]为以第i个元素结尾且和最大的连续子数组。假设对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且和最大的连续子数组实际上,要么是以第i-1个元素结尾且和最大的连续子数组加上这个元素,要么是只包含第i个元素,即sum[i]
= max(sum[i-1] + a[i], a[i])。可以通过判断sum[i-1] + a[i]是否大于a[i]来做选择,而这实际上等价于判断sum[i-1]是否大于0。由于每次运算只需要前一次的结果,因此并不需要像普通的动态规划那样保留之前所有的计算结果,只需要保留上一次的即可,因此算法的时间和空间复杂度都很小
-----------------
以上为转
java
class Solution {
public int maxSubArray(int[] nums) {//动态规划
int sumTemp=nums[0];//边界值
int sum=nums[0];
for(int i=1;i<nums.length;i++){
if(sumTemp>0){ //如果前面的结果>0,+sum[i]才能更大
sumTemp+=nums[i];
}else{//如果前面的结果<=0,那么可以从sum[i]重新开始了
sumTemp=nums[i];
}
sum=Math.max(sumTemp,sum);//本次sumTemp和上次保留的sum比较
}
return sum;
}
}
python
class Solution:
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
st=nums[0];
s=nums[0];
for i in range(1,len(nums)):
if st>0:
st=st+nums[i]
else:
st=nums[i]
s=max(st,s)
return s
3、注意
python没有 for (;;) 要用 for range
python没有i++ 要写成i=i+1
4、动态规划理解和应用 后续待补~~