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

连续子数组的最大和

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

相关推荐

面试拷打成m:我感觉他说的挺对的,感觉我找不到工作也要去送外卖了,至少饿不死
点赞 评论 收藏
分享
内向的柠檬精在研究求...:这不才9月吗,26到明年毕业前能一直找啊,能拿下提前批,转正的,offer打牌的都是有两把刷子的,为什么非要跟他们比。如果别人是9本硕+金牌+好几段大厂实习呢?如果别人是双非通天代呢?如果别人是速通哥呢?,做好自己就行了,我们做不到他们一样提前杀死比赛,但晚点到终点也没啥关系吧
双非应该如何逆袭?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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