其他分享
首页 > 其他分享> > JZ30 连续子数组的最大和

JZ30 连续子数组的最大和

作者:互联网

描述

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).

示例1

输入:[1,-2,3,10,-4,7,2,-5]

返回值:18

说明:输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和 18。

 思路

状态定义:dp[i]表示以i结尾的连续子数组的最大和。所以最终要求dp[n-1]
状态转移方程:dp[i] = max(array[i], dp[i-1]+array[i])
解释:如果当前元素为整数,并且dp[i-1]为负数,那么当然结果就是只选当前元素
技巧:这里为了统一代码的书写,定义dp[i]表示前i个元素的连续子数组的最大和,结尾元素为array[i-1]

    public int FindGreatestSumOfSubArray(int[] array) {

        int max=array[0];
        int[] dp = new int[array.length];
        dp[0]=array[0];

        for (int i = 1; i < array.length; i++) {
            int newMax=dp[i-1]+array[i];
            if(newMax>array[i])
                dp[i]=newMax;
            else
                dp[i]=array[i];

            if (dp[i]>max)
                max=dp[i];
        }

        return max;
    }

标签:newMax,int,JZ30,连续,数组,max,array,dp
来源: https://blog.csdn.net/weixin_58070636/article/details/118946774