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

连续子数组的最大和

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

        这里采用一种时间复杂度为 O(n),空间复杂度为 O(1) 的解法。
        具体思路为:首先定义一个 int型的变量 maxSum,初始值为0,用于保存连续子数组的最大和即最终结果,再定义一个 int型的变量 temp,初始值为0,用于保存当前所遍历到的子数组的和。然后对整个数组进行遍历,对于遍历到的每一个元素,都尝试性地将其累加到 temp上去,① 如果得到的 temp 小于0,说明当前元素是个负数且对于最终结果没有任何贡献,则将 temp 重置为 0,并继续扫描下一个元素;② 如果得到的 temp 不小于 0,则 temp 的值修改为累加后的值。每次处理完一个元素之后,都应当对 maxSum 进行更新,即把temp 和 maxSum 中的较大值赋给 maxSum,这样做的目的是保存截止当前为止的最大值。
        注意,对整个数组遍历完之后,如果 maxSum 的值为 0 ,那么说明整个数组当中的元素都是负数,那么这个时候只需要对数组再进行一次遍历,找出其中的最大值,该最大值便是连续子数组的最大和。
public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        int temp = 0;
        int maxSum = 0;
        for (int i = 0;i < array.length;i++) {
            if (temp + array[i] < 0) {
                temp = 0;
            } else {
                temp = temp + array[i];
            }
            maxSum = max(temp,maxSum);
        }
        if (maxSum == 0) {
            maxSum = array[0];
            for (int number : array) {
                if (number > maxSum) {
                    maxSum = number;
                }
            }
        }
        return maxSum;
    }
    
    private int max(int a,int b) {
        return a > b ? a : b;
    }
}


全部评论

相关推荐

积极的小学生不要香菜:你才沟通多少,没500不要说难
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:10
直接上图
牛客13578115...:改得一般,不值80
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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