题目
原文:
You are given an array of integers (both positive and negative). Find the continuous sequence with the largest sum. Return the sum.
EXAMPLE
Input: {2, -8, 3, -2, 4, -10}
Output: 5 (i.e., {3, -2, 4} )
译文:给出一个整型数组(包括正负数),找出和最大的子序列,并返回该值。
解答
遍历一遍数组,用变量maxsum保存遍历过程中的最大和, 用变量cursum保存遍历过程中的当前和。在遍历的过程中,我们只需要做3件事, 第一:如果当前和cursum小于等于0,说明前面的连续和不会对后面的连续和产生贡献, 要么使后面的连续和减少,要么不变。因此舍弃cursum,用当前的元素更新它。 第二:如果当前和cursum是大于0的,累加当前元素。第三:如果当前和cursum 大于最大和maxsum,则更新最大和maxsum。
class Q19_7{ public static boolean g_invalid=false; public static void main(String[] args){ int[] a={2,-8,3,-2,4,-10}; int max_sum=getMaxSum(a); if(g_invalid) System.out.println("Invalid Input!"); else System.out.println(max_sum); } public static int getMaxSum(int[] a,int n){ if(a==null||n<=0){ g_invalid=true; return 0; } g_invalid=false; int max_sum=1<<31; int cur_sum=0; for(int i=0;i<n;++i){ if(cur_sum<=0) cur_sum=a[i]; else cur_sum+=a[i]; if(cur_sum>max_sum) max_sum=cur_sum; } return max_sum; } //method2, but if the array is all negative numbers, can't use this method public static int getMaxSum(int[] a){ int maxsum=0; int sum=0; for(int i=0;i<a.length;i++){ sum+=a[i]; if(maxsum<sum){ maxsum=sum; }else if(sum<0){ sum=0; } } return maxsum; } }
注:当序列全部是负数时,就不能采用以上的方法了。
---EOF---