求子数组的最大和
#include <iostream> using namespace std; int maxSum(int* a, int n) { int sum=0; int b=0; for(int i=0; i<n; i++) { if(b<0) b=a[i]; else b+=a[i]; if(sum<b) sum=b; } return sum; } int maxSum1(int* a, int n) { int sum=0; int b=0; int i=0; while(i<n) { sum+=a[i++]; if (b<sum) { b=sum; } else if (sum<0) { sum=0; } } return b; } int maxSum2(int* a, int n) { int sum; int b=0; int i=0, j; for (i=0; i<n; i++) { sum=0; for(j=i; j<n; j++) { sum+=a[j]; if (b<sum) { b=sum; } } } return b; } int main() { int a[10]={1, -2, 3, 10, -4, 7, 2, -5}; cout<<maxSum2(a,8)<<endl; return 0; }
maxSum和maxSum1的时间复杂度都是O(n), maxSum2的时间复杂度是O(n^2).
maxSum算法设计
1、遍历数组中的每个元素进行累加,如果累加值小于0,则进行重新累加。
2、用变量sum保存每次累加值比sum的值。
maxSum2算法设计
1、依次从第一个节点遍历最后一个节点。
2、累加每次遍历的结果,用sum保存最大的值。