给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
思路:以下列代码第一种为例
(1)先用sum(起始为num[0])记录前 i-1 个元素中连续子数组最大和,即记录是否对第 i 个数据是否有增益。
(2)当sum>0时,说明 i 位置前面连续子数组值和为正,则 对于i 位置数据是有增益的,如果没有增益直接pass,令sum = nums[i]
(可能有的人不明白为什么令sum = nums[i],举个例子:当增益sum = -1,nums[i] = 2,nums[i]加上增益sum肯定变小了,那不如直接让sum为nums[i])使得比sum = sum + nums[i](sum = -1 + 2 = 1)更大
(3)max默认最大增益为nums[0],将sum与max比较,较大的增益复制给max,最后返回max
代码:
//第一种:
class Solution {
public int maxSubArray(int[] nums) {
int sum = nums[0];
//首先默认首元素为和最大值
int max = nums[0];
for(int i = 1; i < nums.length;i++){
//如果当前i位置的前i-1个数和>0
//则说明此时对该位置数有增益
if(sum > 0){
sum = sum + nums[i];
}else {//如果为负数,则会使当前数字减小,则最大的还是当前数字
sum = nums[i];
}
max = Math.max(sum,max);
}
return max;
}
}
//第二种
class Solution {
public int maxSubArray(int[] nums){
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = nums[0];
for(int i = 1; i < nums.length;i++){
//dp[i]记录前i-1个数据中连续子数据中最大值
dp[i] =Math.max( dp[i-1] + nums[i],nums[i]);
max = Math.max(dp[i],max);
}
return max;
}
}