面试必考真题-算法篇 牛客网
分治 动态规划
题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为O(n),空间复杂度为O(1)
题目分析:
定义一个cur记录当前累加结果,如果当前和为负数的话,再往下累加,则不可能是最大值,因此将它变为0,重新开始。
下面是Java代码
import java.util.*;
public class Solution {
/**
* max sum of the subarray
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxsumofSubarray (int[] arr) {
// write code here
if(arr == null || arr.length ==0){
return 0;
}
int cur = 0;
int len = arr.length;
int max = Integer.MIN_VALUE;
for(int i = 0 ; i < len; i++){
cur += arr[i];
//取两者间的最大值,代表子数组和的最大和
max = Math.max(cur,max);
//如果当前和为负数的话,再往下累加,则不可能是最大值,因此将它变为0,重新开始
//如果不是负数,那么则不改变
cur = cur>0 ? cur: 0;
}
return max;
}
}