剑指Offer:28.连续子数组的最大和

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为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);
    	}
    }

猜你喜欢

转载自blog.csdn.net/waS_TransvolnoS/article/details/91290724