# 最大子数组和

题目要求:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子

数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

1 示例 1:

2 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

3 输出:6

4 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

public class Demo02
{
    public static void main(String[] args)
    {
        int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        int dan = dan(arr);
        System.out.println(dan);
    }
    public static int dan(int nums[])
    {
        int n = nums.length;
        // 创建一个长度为 n 的数组
        int[] dp = new int[n];
        // 将第一个元素赋值给 dp 的第一个位置中
        dp[0] = nums[0];
        // 将 dp 数组的第一个元素的值赋值到 max 作为最大值
        int max = dp[0];
        // 因为已经将第一个元素赋值到了 dp 数组中,所以只需要从 1 开始遍历让 dp 的第一个元素和 nums 的后一个元素进行相加然后比较 nums 原来后一个元素的值取较大值
        for (int i = 1; i < n; i++)
        {
            //dp 数组中的前一个元素 与 nums 数组的后一个元素相加,nums 后一个元素 比较两个值的最大值赋值到 dp 数组的后一个位置
            dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
            //max 值与 dp 后一个元素的值也就是上面获取的最大值比较将最大值赋值给 max
            max = Math.max(max, dp[i]);
        }
        // 返回最大值
        return max;
    }
}

思路分析:

  1. 创建一个长度与 nums 一样的数组
  2. 将 nums 数组的第一个元素赋值给 dp 数组的第一个位置中
  3. 将 dp 的第一个元素作为最大值给 max 变量
  4. 循环判断 dp 的第一个元素与 nums 的后一个元素相加 然后和 nums 的后一个元素比较 较大值
  5. 然后判断 max 与 dp 后一个元素的最大值 并 赋值给 max 变量作为当前的最大值
  6. 最终返回最大值