- 原题链接:53. 最大子数组和
1- 思路
动态规划
动规五部曲
- 1- 定义dp数组:
dp[i]
代表以i
结尾的最大子数组和 - 2- 递推公式:
dp[i]
只有两个方向可以推出来dp[i - 1] + nums[i]
,即:nums[i]
加入当前连续子序列和nums[i]
,即:从头开始计算当前连续子序列和
- 3- 初始化:
dp[0] = nums[0]
- 4- 遍历顺序:从 1 开始遍历
2- 实现
⭐53. 最大子数组和——题解思路
class Solution {
public int maxSubArray(int[] nums) {
// 1.定义 dp 数组
// dp[i] 代表以 i 结尾的 最大子数组和
int[] dp = new int[nums.length];
// 2. 递推公式
// dp[i] = Math.max(dp[i-1]+nums[i],nums[i])
// 3.初始化
dp[0] = nums[0];
// 4.遍历顺序
for(int i = 1;i<nums.length;i++){
dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
}
int res = Integer.MIN_VALUE;
for(int i : dp){
res = Math.max(i,res);
}
return res;
}
}
3- ACM 实现
public class maxSubArray {
public static int maxSub(int[] nums){
// 1.定义dp
// dp代表以 i 结尾的连续子数组长度
int[] dp = new int[nums.length];
// 2.递推公式
// dp[i] = Math.max(nums[i]+dp[i-1],nums[i]);
// 3.初始化
dp[0] = nums[0];
// 4.遍历顺序
for(int i = 1;i<nums.length;i++){
dp[i] = Math.max(dp[i-1]+nums[i],dp[i]);
}
int res = Integer.MIN_VALUE;
for(int i:dp){
res = Math.max(res,i);
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入数组长度");
int n = sc.nextInt();
int[] nums = new int[n];
for(int i = 0 ; i < n;i++){
nums[i] = sc.nextInt();
}
System.out.println("结果是"+maxSub(nums));
}
}