题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 如输入数组[-1,-2,-1,0,3,-9],输出3。
我在美团的二面碰到了这道题,当时的想法是不断构建可变数组,与默认值即全部元素和比较,得出结果,复杂度O(n^2),面试官要求优化到O(n)。
新的思路很简单:定义两个变量curr和res分别对数组第零项开始求和,只要curr<0,就令curr=下一位元素,res全部求和,再与curr比较,哪个大就赋值给res并返回。
比如到第三项时,curr=0,res=0,第五项时curr=3,res=3。
// 计算连续子数组的最大和
public static int findGreatestSumOfSubArray(int[] arr)
{
if(arr==null||arr.length==0)
return 0;
int curr=0,res=0;
for (int i = 0; i < arr.length; i++) {
if(curr<0)
curr=arr[i];
else
{
curr+=arr[i];
res=Math.max(curr, res);
}
}
return res;
}
//测试类
class MaxSub{
public static void main(String[] args) {
int []arr=new int[]{-1,-2,-1,0,3,-9};
int sum=findGreatestSumOfSubArray(arr);
//输出3
System.out.println(sum);
}
}