最大子序和 最大连续子数组和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

初看有点懵逼,一直想有啥简单的解法,想半天只想到用暴力做orz

时间复杂度 O(n^3) 时间爆炸

class Solution {
    public int maxSubArray(int[] nums) {
        int max = -100;
        int sum = 0;
        if(nums.length == 1){
            return nums[0];
        }
        for(int i = 0;i < nums.length; i++){
            for(int j = i ; j < nums.length; j++){
                sum = 0;
                for(int k = i ; k <= j ; k++ ){
                    sum += nums[k];
                    if(sum > max){
                        max = sum;
                    }
                }
            }
        }
        return max;
    }
}

贪心法 相对于暴力简直快的飞起

贪心准则:遍历整个数组,逐一求和sum.当sum <= 0 时,对后续子序列和不是正收益,直接舍弃,同时用max记录sum的最大值.

class Solution {
    public int maxSubArray(int[] nums) {
        int max = -2147483648;//避免干扰设置成最小
        int sum = 0;
        for(int i : nums){
            if(sum > 0){
                sum += i;
            }else{
                sum = i;
            }
            max = max > sum ? max : sum;
            
        }
        return max;
    }
}

学习了大佬们给出的动态规划法 感觉跟贪心法一个思路,只不过是把sum求和结果放在nums上了

class Solution {
    public int maxSubArray(int[] nums) {
        int point = nums[0];
        for(int i = 1;i < nums.length;i++){
            if(point > 0 ){
                nums[i] += point;
            }
            point = nums[i];
        }
        return Arrays.stream(nums).max().getAsInt();
    }
}