zoukankan      html  css  js  c++  java
  • 力扣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)
  • 相关阅读:
    Spark Streaming:大规模流式数据处理的新贵
    HBase源码学习系列
    Hadoop源码分析之Configuration
    sql server存储引擎启动错误(SQL Server could not spawn FRunCM thread)
    Redis(1.15)Redis监控(待写)
    Redis(1.14)Redis日常管理与维护
    Redis(1.13)Redis cluster 分布式集群手动配置
    (5.3.5)数据库迁移——数据库与文件组的位置迁移(同一实例)
    Redis(1.12)Redis cluster搭建常见错误
    Redis(1.11)Redis4.0.11 cluster 分布式集群搭建
  • 原文地址:https://www.cnblogs.com/missidiot/p/11455827.html
Copyright © 2011-2022 走看看