本问题对应的 leetcode 原文链接:剑指 Offer 42. 连续子数组的最大和

问题描述

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例 1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

提示:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100

解题思路

视频讲解直达: 本题视频讲解

代码实现

class Solution {
    public int maxSubArray(int[] nums) {
        int dp = nums[0];
        int max = nums[0];
        // 刷新dp之前,dp相当于是 dp[i-1],刷新之后,Dp就是dp[i]
        for(int i = 1; i < nums.length; i++){
            dp = Math.max(dp + nums[i], nums[i]);
            max = Math.max(max, dp);
        }

        return max;
    }
}

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

Python

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dp = nums[0]
        max_ = nums[0] # 避免使用Python中的关键字max
        # 刷新dp之前,dp相当于是 dp[i-1],刷新之后,Dp就是dp[i]
        for i in range(1, len(nums)):
            dp = max(dp + nums[i], nums[i])
            max_ = max(max_, dp)

        return max_

C++

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int dp = nums[0];
        int max_ = nums[0]; // 避免使用C++中的关键字max
        // 刷新dp之前,dp相当于是 dp[i-1],刷新之后,Dp就是dp[i]
        for(int i = 1; i < nums.size(); i++){
            dp = max(dp + nums[i], nums[i]);
            max_ = max(max_, dp);
        }

        return max_;
    }
};

Go

func maxSubArray(nums []int) int {
    dp := nums[0]
    max_ := nums[0] // 避免使用Go中的关键字max
    // 刷新dp之前,dp相当于是 dp[i-1],刷新之后,Dp就是dp[i]
    for i := 1; i < len(nums); i++ {
        dp = max(dp + nums[i], nums[i])
        max_ = max(max_, dp)
    }

    return max_
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

JS

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
  var dp = nums[0];
  var max = nums[0];
  // 刷新dp之前,dp相当于是 dp[i-1],刷新之后,Dp就是dp[i]
  for (var i = 1; i < nums.length; i++) {
    dp = Math.max(dp + nums[i], nums[i]);
    max = Math.max(max, dp);
  }

  return max;
};

发表回复

后才能评论