求最大子序列的和
传统的嵌套循环的解法:
/////获得最大子序列的和,复杂度O(n^2) int GetMaxSubSequence(int* arr,int len) { int i, j; int curSum; /* 当前序列和 */ int maxSum; /* 最大序列和 */ /* 初始化最大子序列和为序列第一个元素 */ maxSum = arr[0]; /* 外层循环定义子序列起始位置 */ for (i = 0; i < len; i++) { /* 起始位置为i,初始化当前和为0 */ curSum = 0; /* 内层循环定义子序列结束位置 */ for (j = i; j < len; j++) { /* 计算子序列和,并与最大子序列和比较,更新最大子序列和 */ curSum = curSum + arr[j]; /* 与最大子序列和比较,更新最大子序列和 */ if (curSum > maxSum) { maxSum = curSum; } } } return maxSum; }
高效的解法:
////获得最大子序列的和,复杂度O(n) int GetMaxSubSeq(int* arr,int len) { ////非法参数的情况 if(arr==NULL || len < 0) { return -1; } ////全是负数的情况 int index = 0; int maxNum = arr[0]; for(int i = 0;i<len;i ++){ if(arr[i] < 0) { index++; maxNum = maxNum > arr[i] ? maxNum:arr[i]; } else { break; } } if(index == len) { return maxNum; } ////不全是负数的情况 int sum = 0; int max = 0; for(int i=0;i < len;i ++) { sum += arr[i]; max=max<sum?sum :max; sum=sum>0?sum:0; } return max; }
////测试结果 int _tmain(int argc, _TCHAR* argv[]) { int *arr = new int[100]; arr[0]=1; arr[1]=-3; arr[2]=5; arr[3]=6; arr[4]=7; int maxSum = GetMaxSubSeq(arr,5); cout<<maxSum<<endl; delete[] arr; cin.get(); return 0; }