剑指offer42.连续子数组的最大和

剑指offer42.连续子数组的最大和_第1张图片

 这道题挺简单的,看完题脑子里出现的想法就是用一个sum来把数组从前往后加,如果sum小于0,那么对于和来说是会减小的,所以这个时候直接把sum归零,然后从这个位置再往后加,用一个max_sum来记录sum的最大值,最后返回这个max_sum就行,但是如果数组中所有数都是负数,那sum就一直都是0而正确的数是其中的最大的一个负数,所以我用一个max_num来记录其中最大的数。如果max_num<0说明全是负数,这时候max_sum=0,max_sum>max_num,所以无论是不是全是负数,最后返回max_num和max_sum的最大值就行。以下是我的代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int length = nums.length;
        int sum = nums[0];
        int max_sum =sum;
        int max_num = nums[0];
        for(int i =1;i max_num ? max_sum : max_num;
    }
}

写完看了一下题解:原理是一样的,但是它的代码更简洁

class Solution {
    public int maxSubArray(int[] nums) {
        int pre = 0, maxAns = nums[0];
        for (int x : nums) {
            pre = Math.max(pre + x, x);
            maxAns = Math.max(maxAns, pre);
        }
        return maxAns;
    }
}

pre表示以第i-1个数结尾的最大和,如果pre加上nums[i]比num[i]大,那么pre就再加上num[i],否则pre就等于nums[i],这样就可以找到以每个数结尾的最大和,用一个maxAns记录所有和里面最大的,遍历的同时不断维护这个maxAns,最后返回maxAns即可。

你可能感兴趣的:(剑指offer,算法,leetcode,java)