LeetCode刷题——最大子序和#53#Easy

最大子序和题目的思路探讨与源码
    最大子序和的题目如下图,该题属于数组类的题目,主要考察对于动态规划和贪心算法的理解,通过考虑相邻两个位置数字的加和和历史之和的对比,最终得到最大的子序列之和。本人没有想出分治法,使用了两种不同的算法,贪心算法使用的是Python编写,动态规划使用的是Java编写,该题思路较为基础,是简易类的题目。
在这里插入图片描述
    本人认为该题目可以使用贪心算法,本题中贪心算法的核心就是:1)如果当前的元素的历史之和是小于0的,则丢弃历史之和,将最大和改为当前元素值;2)而如果当前的元素的历史之和是大于等于0的。则加上历史之和。

#喷火龙与水箭龟
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if(len(nums)==0):
            return None
        if(len(nums)==1):
            return nums[0]
        FlagCurrentSum=0
        MaxFlagSum=-65532
        for ij in nums:
            if(FlagCurrentSum<0):
                FlagCurrentSum=ij
            elif(FlagCurrentSum>=0):
                FlagCurrentSum=ij+FlagCurrentSum
            else:
                pass
            MaxFlagSum=max(MaxFlagSum,FlagCurrentSum)
        return MaxFlagSum

在这里插入图片描述
    而上述的算法使用的是贪心算法,其实还有一种动态规划方法,而这种动态规划的方法其实就是将上一个值加和到当前值,其具体的思路是:如果前一个元素大于0,那么就把前一个于元素和当前元素加和后进行赋值,赋值给当前的元素,遍历完整个数组后,直接取数组的Max值即可解决。

#喷火龙与水箭龟
class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length==1){
            return nums[0];
        }
        int maxNum = Integer.MIN_VALUE;
        for(int ij=0;ij<nums.length-1;ij++){
            if(nums[ij]>0){
                nums[ij+1]=nums[ij+1]+nums[ij];   
            }
        }
        for(int ij=0;ij<nums.length;ij++){
            if(maxNum<nums[ij]){
                maxNum=nums[ij];
            }
        }
        return maxNum;
    }
}

在这里插入图片描述
    从结果来说是不管是贪心算法还是动态规划的速度还行,但是应该可以进一步提速,希望朋友们能够多多指教,非常感谢。

猜你喜欢

转载自blog.csdn.net/qq_26727101/article/details/112427397
今日推荐