力扣152,53题,最大子序列求和and积

Posted missidiot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣152,53题,最大子序列求和and积相关的知识,希望对你有一定的参考价值。

本内容为最大子序列的求和和求积。采用DP的思路,

当前值加上小于之前值,则从该节点重新算起。

这个代码只能返回其结果值,但不能返回最后的子序列(待修改)。

class Solution:
    def maxSubArray(self,arr):                                  #最大子数组和的DP求解
        if not arr:return
        cur_sub,max_sub = arr[0],arr[0]                         #记录当前集合和最大集合
        res = [arr[0]]
        for i in range(1,len(arr)):                             #从第二个开始遍历
            if arr[i] + cur_sub > arr[i]:                       #如果说加上下一个数比当前值大,那么最大的会在当前值后面
                cur_sub += arr[i]                               #更新当前值
                max_sub = max(cur_sub,max_sub)                  #比较得到当前和最大的较大值
                res.append(arr[i])                              #有误,记录其最大的值
            else:                                               #否则的话就小于,则从当前值开始算起
                res = []
                max_sub = max(arr[i],cur_sub,max_sub,cur_sub+arr[i])#从当前的候选值选个最大的
                cur_sub = arr[i]                                #从当前开始算起
                res.append(arr[i])                              #记录该子数组的节点
        return max_sub,res
    def maxSubArry_1(self,arr):
        if not arr:return
        for i in range(1,len(arr)):
            arr[i] = max(arr[i],arr[i]+arr[i-1])
            print(arr[i],end=,)
        return max(arr)
    def maxProduct(self,nums):                              #子数组求积
        if not nums: return 0
        res, curmax, curmin = nums[0], nums[0], nums[0]     #当前最大和最小
        for i in range(1, len(nums)):                       #从第二个开始遍历
            curmax = curmax * nums[i]                       #与当前值计算看乘积,求最大
            curmin = curmin * nums[i]                       #如果是负数,计算最小值
            curmax = max(curmax, curmin, nums[i])           #选一个最大的
            curmin = min(curmax, curmin, nums[i])           #选一个最小的
            res = curmax if curmax > res else res           #最终的结果缓存在res里面
        return res

if __name__ == __main__:
    solution = Solution()
    arr = [-2,1,-3,4,-1,2,1,-7,-5,4]
    resSub,res = solution.maxSubArray(arr)
    print(最大子数组为:,res,其和为:,resSub)
    res_1 = solution.maxSubArry_1(arr)
    print(res_1)
    resProduct = solution.maxProduct(arr)
    print(最大子数组乘积:,resProduct)

 

以上是关于力扣152,53题,最大子序列求和and积的主要内容,如果未能解决你的问题,请参考以下文章

53.最大子序和 (DP) 与152题相同

动态规划系列之力扣第53题——最大子序和

LeetCode 第53题,最大子序和

❤️思维导图整理大厂面试高频数组14: 最大子序积 和 最大子序和 的不同之处, 力扣152❤️

❤️思维导图整理大厂面试高频数组14: 最大子序积 和 最大子序和 的不同之处, 力扣152❤️

精选力扣500题 第29题 LeetCode 53. 最大子序和c++ / java 详细题解