题解 | #连续子数组的最大和#

连续子数组的最大和

http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484

代码一(看题解写出来)

注意:描述引用他人的,代码自己的
【剑指offer】连续子数组的最大和
典型的动态规划。dp[n]代表以当前元素为截止点的连续子序列的最大和,如果dp[n-1]>0,dp[n]=dp[n]+dp[n-1],因为当前数字加上一个正数一定会变大;如果dp[n-1]<0,dp[n]不变,因为当前数字加上一个负数一定会变小。使用一个变量max记录最大的dp值返回即可。

    public static int fun02(int[] arr) {
        if(arr == null || arr.length == 0) return 0;
        if(arr.length == 1) return arr[1];
        int max = arr[0];
        int sum = arr[0];
        for (int i = 1;i < arr.length;i ++) {
            sum = sum > 0 ? sum + arr[i] : arr[i];
            max = max > sum ? max : sum;
        }
        return max;
    }

代码二(代码一扩展,记录左右下标)

    public static int fun03(int[] arr) {
        if(arr == null || arr.length == 0) return 0;
        if(arr.length == 1) return arr[1];
        int max = arr[0];
        int sum = arr[0];
        int left = 0;
        int right = 0;
        for (int i = 1;i < arr.length;i ++) {
            if (sum > 0) {
                sum = sum + arr[i];
            } else {
                sum = arr[i];
                left = i;
            }
            max = max > sum ? max : sum;
            right = i;
        }
        return max;
    }

代码三(自己肝出来)

    public static int fun(int[] arr) {
        if(arr == null || arr.length == 0) return 0;
        if(arr.length == 1) return arr[1];
        int max = arr[0];
        int sum = arr[0];
        //int left = 0;
        //int right = 0;
        for(int i = 1;i < arr.length;i ++) {
            int temp = sum + arr[i];
            if(temp > sum) {
                if (temp > arr[i]) {
                    sum = temp;
                } else {
                    sum = arr[i];
                    //left = i;
                }
            } else {
                max = max > sum ? max : sum;
                if(temp > arr[i]) {
                    sum = temp;
                } else {
                    sum = arr[i];
                    //left = i;
                }
            }
            //right = i;
        }

        return max > sum ? max : sum;
    }
全部评论

相关推荐

点赞 评论 收藏
分享
程序员牛肉:继续沉淀吧同学,你这就是纯纯的流水线产品。 差不多的学历+两个烂大街项目。自身学历又不行,现在找啥实习呢。有点太浮躁了。多花点心思搞搞ai,开源和八股。这比你这段时间捣鼓一段小厂实习要好得多;
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务