题目:
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
.
More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
找出数组中和最大的子串,可以知道,这个子串一定从正数开始,在正数结尾
那么遇到负数时,怎么判断需不需要把这个负数收纳在子串中呢?很简单,只要后面有正数能够低消它带来的负面影响即可,可以通过sum来记录当前子串的和,一旦sum变为了负值,那么这一段就应该被舍弃,因为它做出的是负贡献,找打接下来的第一个正数重新开始统计子串的和。
另一方面,对于4,-1,2,1,-5,4这种子串,sum不曾小于0,但很明显我们不需要-5,4这个后缀,既然题目只要求返回最大的和,那么我们可以实时记录到目前为止最大的sum,我们只用返回这个最大的sum即可
public class No52_MaximumSubarray {
public static void main(String[] args){
System.out.println(maxSubArray(new int[]{1}));
}
public static int maxSubArray(int[] A) {
int sum = A[0];
int ret = sum;
for(int i=1;i<A.length;i++){
if(sum<0)
sum = A[i];
else
sum += A[i];
ret = ret>sum?ret:sum;
}
return ret;
}
}