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

题目要求 (高频题)

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

你可能感兴趣的:(leetcode题解)