leetcode 53 Maximum Subarray (求最大子数组的和)

本文介绍了如何使用Kadane's算法解决LeetCode上的53题,即找到整数数组中具有最大和的连续子数组。通过一次遍历,用两个变量分别记录局部最优和全局最优,实现O(n)的时间复杂度和O(1)的空间复杂度。示例展示了C++和Python的解题代码。
摘要由CSDN通过智能技术生成

题目要求 (高频题)

给定一个整数数组nums,找到具有最大和的连续子数组(包含至少一个数字)并返回其和。

示例

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

思路方法

暴力遍历法是最容易想到的,但是由于时间消耗太高,所以就不介绍了。在这里推荐一种此类问题总常用的方法:

Kadane’s algorithm. (算是一种动态规划算法) 它需要两个变量,一个用来存储局部最优值,一个用来比较全局最优值。讲解:Why Kadane’s algorithm works?

所以问题就变成了,我们怎么去求当前的局部最优值,和全局最优。
通过遍历数组,首先我们定义变量currentNum,来表示局部最优(也就是以当前遍历元素为结尾的最大子数组),定义变量totalSum,来表示全局最优,并且都初始化为数组首元素。

算法精髓
(1)这里边我们的局部最优有两种可能:(一个是当前局部最优 + 当前遍历元素) / 另一个就只是当前遍历元素。

(2)然后全局最优就是在,上边选出的局部最优和当前全局最优中进行比较,取更大的,即可。然后对每个元素都进行上述两个操作,返回最大子数组的和。

一次遍历即可完成,时间复杂度O(n), 空间复杂度O(1),妥妥的解决此类问题!

主要代码c++
<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值