题目描述:给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
解题想法:
用一个数组记录以nums[i]结尾的连续子数组的最大和
用另一个变量记录遍历数组里的各个最大和,记录最大的最大和。
解题方法参考leetCode用户:liweiwei1419(标个出处)
class Solution {
public int maxSubArray(int[] nums) {
int dp[] = new int[nums.length];
dp[0] = nums[0];
/*
从第二个数开始遍历,即索引为1的,
dp[i] 表示:以 nums[i] 结尾的连续子数组的最大和
*/
for(int i=1;i<nums.length;i++){
//若前一个最大和大于零,那么与当前索引的nums[i]相加得到新的最大和dp[i]
if(dp[i-1] > 0){
dp[i] = dp[i-1] + nums[i];
}else{
/*
若前一个最大和小于零,那么当前最大和dp[i]为nums[i],
因为nums[i]与小于等于0的数相加会变小,
所以以当前nums[i]作为新的子数组开头
*/
dp[i] = nums[i];
}
}
int maxSum = dp[0];
for(int i=1;i<dp.length;i++){
maxSum = Math.max(maxSum,dp[i]);
}
return maxSum;
}
}
简化版(官方题解):
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0;
int maxSum = nums[0];
for(int i:nums){
pre = Math.max(i+pre,i);
maxSum = Math.max(maxSum,pre);
}
return maxSum;
}
}
执行结果: