给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
思路:使用动态规划的方法,假设自己是后一个数,判断上次和是否是大于0,如果大于0,说明加上去对自己是有益的,可以加上去,如果上次和是小于0的,说明加上去之后反而会让自己变得更小,对自己是不利的。(如果我是后面的数字,我肯定希望前面传给我一个正数,给我一个负数把我变小,那我不如只要自己)
动态规划的要点就是可以利用上一个状态,而在本题中,判断上一个状态是否是自己需要用的,就是本题的思路。
class Solution {
public int maxSubArray(int[] nums) {
int last = 0;
int max = nums[0];
for (int i = 0; i < nums.length; i++){
last = Math.max(nums[i],last + nums[i]);
max = Math.max(last,max);
}
return max;
}
}
以下是自己第一次做时的思路和代码,有点绕弯子了
1.定义上次和
2.定义最大和
3.遍历数组
4.判断上次和是否大于0
5.如果上次和大于0,将上次和与当前值相加,如果上次和小于0,就采用当前值
6.比较最大和与上次和的大小,取大值
class Solution {
public int maxSubArray(int[] nums) {
int last = 0;
int max = nums[0];
for (int i = 0; i < nums.length; i++){
if (last >= 0){
last += nums[i];
}else {
last = nums[i];
}
if (last >= max){
max = last;
}
}
return max;
}
}