53-最大子序和-Java&python

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;i0){ //如果前面的结果>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    
            

        

 

53-最大子序和-Java&python_第1张图片


3、注意

python没有 for (;;) 要用 for range

python没有i++  要写成i=i+1

4、动态规划理解和应用 后续待补~~

你可能感兴趣的:(python,leetcode,java)