题目:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
我们先定义一个函数F(N)表示nums数组以第N个元素为尾部的最大子序和,那么答案一定在F(1),F(2),F(3)…F(N)中,令F(1)为nums[0], 则有:
F(N) = F(N-1) +nums[N];(当F(N-1)>0时)
F(N) = nums[N];(当F(N-1)<=0时)
所以我们便可以从F(2)开始一个一个算起,直到F(N),选取其中最大者,即为结果
而进一步分析后,我们可知,在运算过程中,由于是线性的,所以每一次运算只需要两个变量,一是存储结果的 res,二是存储F(N-1)的pre,所以我们将代码简化后。
public class Solution1 {
public int Maximum_Subarray (int[] nums) {
if(nums.length == 1) {
return nums[0];
}
int res = nums[0];
int now = 0;
int pre = nums[0];
for(int i = 1;i<nums.length;i++) {
if(pre<=0) {
now = nums[i];
}
else {
now = nums[i]+pre;
}
pre = now;
if(now>res) {
res = now;
}
}
return res;
}