• 使用滑动窗口法:

    重点:需要存储当前滑动窗口的和,如果<=0,就不需要在它的基础上加上当前值

    public int FindGreatestSumOfSubArray(int[] array) {
            //滑动窗口法:
            if(array==null || array.length==0)
                return -1;
            int max=Integer.MIN_VALUE;//存储最大值,初始化为极小值
            int tempSum=0; //当前滑动窗口的和
            for(int i=0;i<array.length;i++){
                if(tempSum<=0){//当前滑动窗口的和<=0,则不需要在它的基础上加第i项
                    tempSum=array[i];
                }
                else{
                    tempSum+=array[i];
                }
                if(tempSum>max)
                    max=tempSum;
            }
            return max;
    }
  • 易错点:(上面的tempSum就是此处的preSum),preSum的更新基于最大值,这种思路是错误的!!!

    public int FindGreatestSumOfSubArray(int[] array) {
        //动态规划法
        if(array==null || array.length==0)
                return -1;
        int preSum=0;//前一次的结果
        int realSum=Integer.MIN_VALUE;//后一次的结果
        for(int i=0;i<array.length;i++){
            preSum = Math.max(array[i], realSum + array[i]);
            realSum = Math.max(realSum, preSum);
        }
        return realSum;
    }

    原因分析:最大和的更新基于上次的最大和,但是上次的最大和与array[i]之间不一定连续,也就是说直接相加可能会跳过中间的一些值。

    示例:数组[1,-5,5] 错误方案求出的最大和是6,实际结果应该是5


未期
1 声望1 粉丝

加油做一名高质量的技术分享者!