https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/
题目描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
输入输出样例
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
题解
贪心的思想。
- 如果上一次的结果对当前的连加是
增益
的,就继续连加 - 如果上一次计算的结果对当前的连加是
减益
的,就将更换sum -
一段增益的序列最后在X位置变成了减益,从这个增益序列中的任何一个位置出发,其结果都会在X位置变成减益,所以可以放心地继续往后遍历。
- 记录下每次的最大sum
特殊的情况:
全是负数的情况,那么每次都是减益的,最终将记录下最小的负数。
代码:
class Solution {
public int maxSubArray(int[] nums) {
int sum = 0;
int max = Integer.MIN_VALUE;
for(int num:nums){
if(sum > 0)
sum += num;
else
sum = num;
max = Math.max(max, sum);
}
return max;
}
}