题目描述
// 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;
}
}