Cracking the coding interview--Q19.7

题目

原文:

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---

你可能感兴趣的:(relearn)