力扣热题100之第53题:
先贴代码:
class Solution {
public int maxSubArray(int[] nums) {
//定义一个cur,存储子数组的和
int cur = 0;
//定义maxsum,为连续子数组的最大和
int maxsum = nums[0];
//for循环遍历数组,cur为从0开始的子数组和,若遍历到x时,之前子数组的和小于x的值
//则抛弃之前的子数组,cur从当前的x开始计算新的子数组的和
//maxsum记录每一个子数组之间的最大值!
for (int x : nums) {
cur = Math.max(cur + x, x);
maxsum = Math.max(maxsum, cur);
}
//返回maxsum
return maxsum;
}
}
解题思路:本题目中要求我们求出连续子数组的最大和,需要注意子数组必须为连续的,即下标连续递增。然而题目中并没有要求子数组具体是多大,可能是一个元素,也可能是三个元素,我们并不清楚,最简单最直观的方法就是列出当元素为1时所有子数组,当元素为2时所有的子数组,等等,最后求出这些子数组之间和的最大值。但是这样写的话过于麻烦,时间复杂度也很高,那么我们可不可以再优化下呢?
我们刚刚提到的方法是列出所有的子数组,再在这些子数组中求出最大的和。那么我们可以定义一个变量cur用来表示一个当前子数组的和。cur从0开始,依次往后加上元素的值,如果遍历到i时,子数组的和cur加上i下标的值的总和还要小于i下标的值,那么就令cur从i下标开始计算新的子数组的和,因为之前连续元素的和都已经小于新子数组第一个元素的值了。
由此就可以一次遍历解决问题。