给定一个有正有负的整数数组A及其大小n,返回从前往后相加最大的连续数列的和。保证n的大小小于等于3000。
测试样例:
[1,2,3,-6,1]
返回:6
import java.util.*;
public class MaxSum {
public int getMaxSum(int[] A, int n) {
// write code here
if (n == 0) {
return 0;
}
int sum = 0;
int max_sum = (int) Double.NEGATIVE_INFINITY;
for (int i = 0; i < n; i++) {
if (sum < 0) {
sum = A[i];
}else {
sum += A[i];
}
if (sum > max_sum) {
max_sum = sum;
}
}
return max_sum;
}
}
思路:时间复杂度O(n),空间复杂度O(1) 1.首先定义一个和的最小值 2.遍历开始累加 一开始是最小值 ,所以 sum += A[0];sum > max; max 就为A[0]; 判断如果sum 是小于0,重置sum = 0, (累加的初始值还应从0 开始),因为我们把值存在了max中,所以sum 重置为0 不影响max的变化,所以每次比较 sum 和 max 就好 3.这种解法 还有利于求解 产生最大值的区间位置 4.区间位置:就是最后一次更新 sum = 0时,和最后一次max 更新时的位置 即可 int getMaxSum(vector<int> A, int n) { // write code here int sum = 0; int max = -(1 << 30); for(int i=0;i<n;i++) { sum += A[i]; if(sum > max) { max = sum; } if(sum < 0) { sum = 0; } } return max; }