Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
思考:
我们先考虑局部相邻的数组第 i 位的最大子数组。
如果前面相邻的第 i - 1位的最大子树组值为 curMaxVal
那么如果curMaxVal + nums[ i ] > nums[ i ]。则表示可以继续往下加,否则,取nums[ i ]。
最后将所有数组第 i 位的值取max,就是最终的最大值。
这个题跟:买卖股票的最好时间 思想很类似。
运行时间:
代码:
public class MaximumSubarray {
public int maxSubArray(int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
if (n == 1) {
return nums[0];
}
int curMaxVal = nums[0];
int maxVal = nums[0];
for (int i = 1; i < n; i++) {
if (curMaxVal > 0) {
curMaxVal += nums[i];
} else {
curMaxVal = nums[i];
}
maxVal = Math.max(maxVal, curMaxVal);
}
return maxVal;
}
}