Nicksxs's Blog

What hurts more, the pain of hard work or the pain of regret?

0%

# Leetcode 053 最大子序和 ( Maximum Subarray ) 题解分析

发表于 2021-11-28 分类于 Java ， leetcode 阅读次数： 阅读次数： Disqus：

### 题目介绍

Given an integer array `nums`, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

A subarray is a contiguous part of an array.

#### 示例

Example 1:

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

Example 2:

> Input: nums = [1]
> Output: 1

Example 3:

> Input: nums = [5,4,-1,7,8]
> Output: 23

说起来这个题其实非常有渊源，大学数据结构的第一个题就是这个，而最佳的算法就是传说中的 online 算法，就是遍历一次就完了，最基本的做法就是记下来所有的连续子数组，然后求出最大的那个。

### 代码

    public int maxSubArray(int[] nums) {
            int max = nums[0];
            int sum = nums[0];
            for (int i = 1; i < nums.length; i++) {
                // 这里最重要的就是这一行了，其实就是如果前面的 sum 是小于 0 的，那么就不需要前面的 sum，反正加上了还不如不加大
                sum = Math.max(nums[i], sum + nums[i]);
                // max 是用来承载最大值的
                max = Math.max(max, sum);
            }
            return max;
        }