PAT (Advanced Level) Practice 1007 Maximum Subsequence Sum(极短代码,O(n) 解决)

1007 Maximum Subsequence Sum
题意: 求一串数字的最大连续和,并且输出最左端的数字和最右端的数字。
这个题可以用一个for循环解决,时间复杂度O(n)。主要是先设置两个端点i,j,i为左端点,j为右端点。如图所示:

-101234-5-2337-21

i 和 j 开始都从数组下标0开始,然后用sum += a[ j ];如果发现sum < 0,i = j + 1, 继续循环(每次循环 j++),(因为sum > 0,不管怎样,往后加,都只会增加而不会减少) 如果sum > max , max = sum ,用letf = a[ i ],right = a[ j ],记录两端的值。详细实现见代码,这个也可以自己手动模拟一下。
AC代码:

#include <stdio.h>


int main(){
	int n, a[10005], sum = 0, max = -1, left, right;
	scanf("%d", &n);
	for(int i = 0, j = 0; j < n; j++){
		scanf("%d", &a[j]);
		sum += a[j];
		if(sum < 0){
			sum = 0;
			i = j + 1;
			continue;
		}
		if(sum > max){
			max = sum;
			left = a[i];
			right = a[j];
		}
	}
	if(max < 0) max = 0, left = a[0], right = a[n - 1];
	printf("%d %d %d", max, left, right);
	return 0;
}

End

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页