有一个很经典的题目:给定一个整数组,求连续子序列的最大和,整数为正、负、0皆有可能。
先考整数不是全负的情况,和最大的连续子序列,必然是以一个非负数开头,因为和加上一个负数,和变小,此外,和为负数的连续子序列,也不可能是目标子序列的开头的一段序列,因为如果目标序列起始的几个数为负,那么总可以通过将开头的这几个数去掉,这样目标序列的和更大。这种思路能得到一个算法复杂度为O(N)、空间复杂度为O(1)的算法。
有一些实现中,利用上述思路实现了算法,但是很多没有考虑数组的数全负的情况,在全负的情况下,最大子序列和会返回0,这样并没有完全实现题目要求。对于全负的情况,只要在遍历的同时,找到数组中最大的数字,这个最大数字就是最大连续子序列和。
先考整数不是全负的情况,和最大的连续子序列,必然是以一个非负数开头,因为和加上一个负数,和变小,此外,和为负数的连续子序列,也不可能是目标子序列的开头的一段序列,因为如果目标序列起始的几个数为负,那么总可以通过将开头的这几个数去掉,这样目标序列的和更大。这种思路能得到一个算法复杂度为O(N)、空间复杂度为O(1)的算法。
有一些实现中,利用上述思路实现了算法,但是很多没有考虑数组的数全负的情况,在全负的情况下,最大子序列和会返回0,这样并没有完全实现题目要求。对于全负的情况,只要在遍历的同时,找到数组中最大的数字,这个最大数字就是最大连续子序列和。
考虑全负情况的实现如下:
/**********************
* get maxium sum of the sub sequence
* created by poetteaes
* date: 2018-04-15
***********************/
# include <stdio.h>
# define MAX_ARR_LEN 100
int getMaxSum(int arr[], int N, int *maxSUm);
int main(void)
{
int N;
int Arr[MAX_ARR_LEN];
int i;
int ret;
int maxSum;
/*input*/
printf("Please input an positive integer N which is betw