当前位置: 代码迷 >> 综合 >> leetcode 53 Maximum Subarray (求最大子数组的和)
  详细解决方案

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

热度:11   发布时间:2023-11-17 01:26:39.0

题目要求 (高频题)

给定一个整数数组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++

class Solution {
    
public:int maxSubArray(vector<int>& nums) {
    int currentNum = nums[0], totalSum = nums[0];for(int i = 1; i<nums.size(); i++){
    currentNum = max(currentNum + nums[i], nums[i]);totalSum = max(totalSum, currentNum);}return totalSum;}
};

python

class Solution(object):def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""sum_ = subsum_ = float('-inf')for i in range(len(nums)):subsum_ = max(nums[i], subsum_+nums[i])sum_ = max(sum_, subsum_)"""if subsum_+nums[i] > nums[i]:subsum_ = subsum_+nums[i]else:subsum_ = nums[i] if sum_ < subsum_:sum_ = subsum_"""          return sum_

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

  相关解决方案