【leetcode系列】【算法】【简单】最大子序和

题目:

原题链接: https://leetcode-cn.com/problems/maximum-subarray/

 

解题思路:

1. 经典最大子序列求和算法,时间复杂度O(N),流程如下:

变量如下:

  1. max_sum,最大和,初始化为float('-inf')
  2. curr_sum,当前和,初始化为0
  3. curr_num,当前遍历到的元素

算法流程如下:

  1. 从前向后遍历数组,每遍历一个数字,更新curr_sum = curr_sum + curr_num
  2. 如果curr_sum > max_sum,则更新max_sum = curr_sum
  3. 如果curr_sum < 0,则更新curr_sum = 0

 

2. 分治法,时间复杂度为O(NlogN),练习分治法的好题目

分治法的一般思路如下:

  1. 定义基本情况
  2. 将问题分解为子问题并递归地解决它们
  3. 合并子问题的解以获得原始问题的解

对于此题,分治法的步骤如下:

变量如下:

  1. n:当前处理的子串中元素个数
  2. left : 当前子串的起点索引
  3. right : 当前子串的终点索引
  4. left_sum : left到(left + right) / 2元素的连续最大子序列的和
  5. right_sum : (left + right) / 2到right元素的连续最大子序列的和
  6. cross_sum: 包含左右子数组且含索引 (left + right) / 2 的最大值

算法图解如下:

在这里插入图片描述

代码实现:

方法一:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        curr_sum, max_sum = 0, float('-inf')
        for curr_num in nums:
            curr_sum += curr_num
            if curr_sum >= max_sum:
                max_sum = curr_sum

            if curr_sum < 0:
                curr_sum = 0

        return max_sum

方法二:

class Solution:
    def cross_sum(self, nums, left, right, p): 
            if left == right:
                return nums[left]

            left_subsum = float('-inf')
            curr_sum = 0
            for i in range(p, left - 1, -1):
                curr_sum += nums[i]
                left_subsum = max(left_subsum, curr_sum)

            right_subsum = float('-inf')
            curr_sum = 0
            for i in range(p + 1, right + 1):
                curr_sum += nums[i]
                right_subsum = max(right_subsum, curr_sum)

            return left_subsum + right_subsum   
    
    def helper(self, nums, left, right): 
        if left == right:
            return nums[left]
        
        p = (left + right) // 2
            
        left_sum = self.helper(nums, left, p)
        right_sum = self.helper(nums, p + 1, right)
        cross_sum = self.cross_sum(nums, left, right, p)
        
        return max(left_sum, right_sum, cross_sum)
        
    def maxSubArray(self, nums: 'List[int]') -> 'int':
        return self.helper(nums, 0, len(nums) - 1)

作者:LeetCode
链接:https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值