# 最大子数组和
题目要求:
给你一个整数数组 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; | |
} | |
} |
思路分析:
- 创建一个长度与 nums 一样的数组
- 将 nums 数组的第一个元素赋值给 dp 数组的第一个位置中
- 将 dp 的第一个元素作为最大值给 max 变量
- 循环判断 dp 的第一个元素与 nums 的后一个元素相加 然后和 nums 的后一个元素比较 较大值
- 然后判断 max 与 dp 后一个元素的最大值 并 赋值给 max 变量作为当前的最大值
- 最终返回最大值