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

连续子数组的最大和

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;
    }
全部评论

相关推荐

03-11 21:46
西北大学 Java
河和静子:这只是实习工资,我学长北大通班博一的,他同学被这家天天发邮件让他去实习,一个月10w
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务