【Leetcode】53. 最大子序和

128 阅读1分钟

题目描述

在这里插入图片描述

// 53. 最大子序和

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

题解

// 动态规划
// 排除特殊情况,
// 假设数组头元素之前还有一个伪头元素,为0,令pre指向0,创建答案保存位res,
// 初始化res为nums[0],for循环遍历nums元素,记为num,pre用于记录字数组和,
// 如果pre+num比num大,说明子数组和pre不是负的,用pre+num更新pre。
// 如果pre+num比num小,说明子数组和pre已经是负的了,pre要舍弃掉,用num更新为pre。
// 之后取res和pre中的最大值更新到res中,这样pre记录过的子数组和中的最大值,
// 一定会被保存到res中,不会丢失。
// 最后返回res即可。
//
// 执行用时:1 ms, 在所有 Java 提交中击败了94.73%的用户
// 内存消耗:38.4 MB, 在所有 Java 提交中击败了49.34%的用户
class Solution {
    public int maxSubArray(int[] nums) {
        if (nums == null || nums.length == 0)
            return 0;
        int pre = 0, res = nums[0];
        for (int num: nums) {
            pre = Math.max(pre + num, num);
            res = Math.max(res, pre);
        }
        return res;
    }
}