> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/suan-fa/zui-da-zi-xu-lie.md).

# 最大子序列

## 问题

给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。

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

## 分析

这就是经典的Kadane算法。

1. 先将问题进行拆分,指定数组中某一个元素A\[i]作为最大子数列的末尾元素时,能找到的最大子数列的求和值是多少
2. 这样就会发现，A\[i]作为末尾元素时能找到的最大子数列max\_i肯定为A\[i]或者以A\[i-1]作为末尾元素时找到的最大子数列max\_i-1加上A\[i]【对应步骤1】
3. 所以我们只需要从头到尾遍历数组，依次计算出每一个位置的A\[i]作为末尾元素时，能找到的最大子数列max\_i
4. 然后通过另外一个变量记录下次过程中找到的最大的那个序列值【对应步骤2】

## 解答

```java
    public static int maxSubArray(int[] nums) {
        if(nums.length == 0) return 0;
        int max = nums[0], maxCur = nums[0];
        for(int i = 1; i < nums.length; i++) {
            maxCur = Math.max(maxCur + nums[i], nums[i]);//步骤1
            max = Math.max(max, maxCur);//步骤2
        }
        return max;
   }
```
