leetcode-53 最大子序和 python3 贪心解法

解题思路:
记录当前元素nums[i],当前序列的最大值result_temp,总的最大值result
1.如果元素全为负数,则选出最大的负数,并返回。
2.如果元素内有正数也有负数,则:
1. 如果遇到负数,有两种情况。第一种,此负数对当前序列最大值可能有贡献,例如:2,-1,3.此时保留该负数。如果,当前子序列的和result_temp+负数>0(当后面的数为正数时,该负数可以保留),将result_temp更新为result_temp+该负数。第二种,比如:2,-3,4.此时,该负数不可能对当前的子序列有贡献,舍弃该负数,并将result_temp更新为0,计算下一个子序列的和。
2. 如果遇到正数,则当前子序列和一定会变大。此时更新reuslt_temp += 该正数,更新result为result_temp。
3. 返回最终的最大值result.

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if not nums:
            return
        if len(nums) == 1:
            return nums[0]
        result = nums[0] 
        result_temp = nums[0]
        for i in range(1,len(nums)):
            if nums[i] < 0 :
                if result < 0:
                    if nums[i] > result:
                        result = nums[i]
                        continue
                if nums[i] +result_temp <= 0:
                    result_temp = 0
                    continue
                else:
                    result_temp += nums[i]
                    if result_temp > result:
                        result = result_temp
            else:
                if result < 0:
                    result = 0
                    result_temp = 0
                result_temp += nums[i]
                if result_temp > result:
                    result = result_temp
        return result

时间复杂度O(n),空间复杂度O(1)

我的方法看起来比较复杂,看到官方的方法写的更为简洁,不过思想是差不多的。

官方方法:

class Solution:
    def maxSubArray(self, nums: 'List[int]') -> 'int':
        n = len(nums)
        curr_sum = max_sum = nums[0]

        for i in range(1, n):
            curr_sum = max(nums[i], curr_sum + nums[i])
            max_sum = max(max_sum, curr_sum)
            
        return max_sum
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,464评论 0 5
  • 题目: 题目链接https://leetcode-cn.com/problems/maximum-subarray...
    WolfLC阅读 2,126评论 0 3
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,928评论 0 8
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,313评论 0 3
  • 问题描述 问题分析 求一个最大子列和,其子列的开头和结尾必然不是负数,怎么能够最快的求出最大子列和呢?解决思路如下...
    片帆沙岸v阅读 119评论 0 0