具体实现:
/*输入一组数组,求所有子数组的和的最大值。 例如:{1,-2,3,10,-4,7,2,-5},最大的子数组为{3,10,-4,7,2},和为18。*/ #include "iostream" template <typename T> T max_subArray(T* a, int n) //写成模板是想参数传递的类型多一点,double、int都可以适应。可是多了一个参数n不是特别完美。 { //int n = sizeof(a); if (n == 0) return 0; T current_max = a[0]; T sub_sum = a[0]; int i = 1; //只输出最大和,所以没有记录子数组起始终止位置,如有要求,也是可以记录的。 while (i != n) { sub_sum += a[i]; if (sub_sum > current_max) { current_max = sub_sum; } else if (sub_sum < 0) { sub_sum = 0; } i++; } return current_max; } using namespace std; int main(void) { int a[] = {1,-2,3,10,-4,7,2,-5}; int result = max_subArray(a, sizeof(a)/sizeof(int)); cout << result << endl; return 0; }
说明:
1. 全负数情况也是可以通过测试的,为该数组元素最大值。
2. 空数组输出0。