user-0 提问: 求子数组和的最大值（数组中元素有正有负）要求时间复杂度为0（n）

回复:
user: user-0
content: 引用 9 楼 fefe82的回复:#include<iostream> using namespace std; int findGreatestSubSum(const int a[],int size) {     if (size < 1) return 0;     int curSum = a[0];     int maxSum = a[0];     for(int i=1; i<size; i++) {         if (curSum > 0) curSum += a[i]; else curSum = a[i];         if (curSum > maxSum) maxSum = curSum;     }     return maxSum; } int main(void) {     int a[10]= {1, -2, 3, 10, -4, 7, 2, -5};     cout<<findGreatestSubSum(a,10)<<endl;     return 0; }  能使用c语言不用c++吗 谢谢

user: user-0
content: 引用 9 楼 fefe82的回复:#include<iostream> using namespace std; int findGreatestSubSum(const int a[],int size) {     if (size < 1) return 0;     int curSum = a[0];     int maxSum = a[0];     for(int i=1; i<size; i++) {         if (curSum > 0) curSum += a[i]; else curSum = a[i];         if (curSum > maxSum) maxSum = curSum;     }     return maxSum; } int main(void) {     int a[10]= {1, -2, 3, 10, -4, 7, 2, -5};     cout<<findGreatestSubSum(a,10)<<endl;     return 0; }  这个不是c++吗 我想知道c的写法是一样的吗

user: user-1
content: #include<iostream> using namespace std; int findGreatestSubSum(const int a[],int size) {     if (size < 1) return 0;     int curSum = a[0];     int maxSum = a[0];     for(int i=1; i<size; i++) {         if (curSum > 0) curSum += a[i]; else curSum = a[i];         if (curSum > maxSum) maxSum = curSum;     }     return maxSum; } int main(void) {     int a[10]= {1, -2, 3, 10, -4, 7, 2, -5};     cout<<findGreatestSubSum(a,10)<<endl;     return 0; }

user: user-2
content: 先把题目搞清楚，定义一个数组a[n]，求数组a[n]中子数组的和，其中数组中连续的一个或多个整数组成一个子数组，时间复杂度为O(n)意味着，代码的执行时间是线性的，类似嵌套循环的时间复杂度是n*n那是不行的。 采用dp思想，首先定义一个最大和，一个数组和，并且初始化为0，思想是，跟数组和之前最大的数组和比较，假如大就跟新，假如小则不做操作，假如数组和小于0的话，则把数组和设为0，重新计算。(这是有正有负的)，假如全是负数的话，直接输出最大值。 给个代码吧 //求子数组的最大和 #include<iostream> using namespace std; int findGreatestSubSum(const int a[],const int size){     int curSum=0;     int maxSum=0;     for(int i=0;i<size;i++){         curSum+=a[i];         if(curSum<0) curSum=0;                  if(curSum>maxSum) maxSum=curSum; //更新最大和     }     if(maxSum==0){            //若是数组中的元素均为负数，则输出里面的最大元素         maxSum=a[0];                   for(int i=1;i<size;i++){             if(maxSum<a[i]) maxSum=a[i];         }     }     return maxSum; } int main(void){     int a[10]={1, -2, 3, 10, -4, 7, 2, -5};     cout<<findGreatestSubSum(a,10)<<endl;     system("pause");     return 0; }

user: user-0
content: 引用 5 楼 Sniper_Pan的回复:经典面试题啊。。。 核心思想是遍历一遍找到最大值位置，然后从该位置往左遍历加一遍找到和最大位置，继续往右来一遍。 最后将左右最大值位置为子数组和最大值。 我看不到懂上面另一个人的代码 能跟我解释一下吗

user: user-0
content: 引用 5 楼 Sniper_Pan的回复:经典面试题啊。。。 核心思想是遍历一遍找到最大值位置，然后从该位置往左遍历加一遍找到和最大位置，继续往右来一遍。 最后将左右最大值位置为子数组和最大值。 我自己的算法哪里错啦

user: user-3
content: 经典面试题啊。。。 核心思想是遍历一遍找到最大值位置，然后从该位置往左遍历加一遍找到和最大位置，继续往右来一遍。 最后将左右最大值位置为子数组和最大值。

user: user-2
content: 引用 3 楼 stan_the_man 的回复:[quote=引用 1 楼 user-5的回复:]#define max(a, b) ((a)>(b)?(a):(b)) static int test_max_subrange_sum(int *array, int n) {     int i, max_sum, cur_sum;      if(n <= 0) {         return -1;     }      max_sum = cur_sum = array[0];      for(i = 1; i < n; i++) {         if(cur_sum < 0) {             max_sum = max(max_sum, cur_sum);             cur_sum = array[i];         } else { // cur_sum >= 0             if(array[i] >= 0) {                 cur_sum += array[i];             } else { // array[i] < 0                 max_sum = max(max_sum, cur_sum);                 if(cur_sum + array[i] > 0) {                     cur_sum += array[i];                  } else {                     cur_sum = array[i];                 }             }         }     }      max_sum = max(max_sum, cur_sum);      return max_sum; } 刚刚写的， 判断有些冗长，但貌似结果正确。应该有更简洁的吧。 这是为什么啊 为什么不能运行。[/quote]  缺少main函数？

user: user-0
content: 引用 1 楼 user-5的回复:#define max(a, b) ((a)>(b)?(a):(b)) static int test_max_subrange_sum(int *array, int n) {     int i, max_sum, cur_sum;      if(n <= 0) {         return -1;     }      max_sum = cur_sum = array[0];      for(i = 1; i < n; i++) {         if(cur_sum < 0) {             max_sum = max(max_sum, cur_sum);             cur_sum = array[i];         } else { // cur_sum >= 0             if(array[i] >= 0) {                 cur_sum += array[i];             } else { // array[i] < 0                 max_sum = max(max_sum, cur_sum);                 if(cur_sum + array[i] > 0) {                     cur_sum += array[i];                  } else {                     cur_sum = array[i];                 }             }         }     }      max_sum = max(max_sum, cur_sum);      return max_sum; } 刚刚写的， 判断有些冗长，但貌似结果正确。应该有更简洁的吧。 这是为什么啊 为什么不能运行。

user: user-0
content: 引用 1 楼 user-5的回复:#define max(a, b) ((a)>(b)?(a):(b)) static int test_max_subrange_sum(int *array, int n) {     int i, max_sum, cur_sum;      if(n <= 0) {         return -1;     }      max_sum = cur_sum = array[0];      for(i = 1; i < n; i++) {         if(cur_sum < 0) {             max_sum = max(max_sum, cur_sum);             cur_sum = array[i];         } else { // cur_sum >= 0             if(array[i] >= 0) {                 cur_sum += array[i];             } else { // array[i] < 0                 max_sum = max(max_sum, cur_sum);                 if(cur_sum + array[i] > 0) {                     cur_sum += array[i];                  } else {                     cur_sum = array[i];                 }             }         }     }      max_sum = max(max_sum, cur_sum);      return max_sum; } 刚刚写的， 判断有些冗长，但貌似结果正确。应该有更简洁的吧。 这个不要包括库函数之类的东西吗？

user: user-0
content: 引用 12 楼 linuxqianrushikaifa的回复:[quote=引用 11 楼 stan_the_man 的回复:] [quote=引用 9 楼 fefe82的回复:] #include<stdio.h> int findGreatestSubSum(const int a[],int size) {     if (size < 1) return 0;     int curSum = a[0];     int maxSum = a[0];     for(int i=1; i<size; i++) {         if (curSum > 0) curSum += a[i]; else curSum = a[i];         if (curSum > maxSum) maxSum = curSum;     }     return maxSum; } int main(void) {     int a[10]= {1, -2, 3, 10, -4, 7, 2, -5};     int max;     max=findGreatestSubSum(a,10);     printf(“%d\n”max);     return 0; } [/code] c语言的东西大多数都适用于c++,毕竟是基础么。[/quote] 这个可做到输入任意数组吗

user: user-0
content: 引用 12 楼 linuxqianrushikaifa的回复:[quote=引用 11 楼 stan_the_man 的回复:] [quote=引用 9 楼 fefe82的回复:] #include<stdio.h> int findGreatestSubSum(const int a[],int size) {     if (size < 1) return 0;     int curSum = a[0];     int maxSum = a[0];     for(int i=1; i<size; i++) {         if (curSum > 0) curSum += a[i]; else curSum = a[i];         if (curSum > maxSum) maxSum = curSum;     }     return maxSum; } int main(void) {     int a[10]= {1, -2, 3, 10, -4, 7, 2, -5};     int max;     max=findGreatestSubSum(a,10);     printf(“%d\n”max);     return 0; } [/code] c语言的东西大多数都适用于c++,毕竟是基础么。[/quote] 还有第二行那些有什么用

user: user-0
content: 引用 12 楼 linuxqianrushikaifa的回复:[quote=引用 11 楼 stan_the_man 的回复:] [quote=引用 9 楼 fefe82的回复:] #include<stdio.h> int findGreatestSubSum(const int a[],int size) {     if (size < 1) return 0;     int curSum = a[0];     int maxSum = a[0];     for(int i=1; i<size; i++) {         if (curSum > 0) curSum += a[i]; else curSum = a[i];         if (curSum > maxSum) maxSum = curSum;     }     return maxSum; } int main(void) {     int a[10]= {1, -2, 3, 10, -4, 7, 2, -5};     int max;     max=findGreatestSubSum(a,10);     printf(“%d\n”max);     return 0; } [/code] c语言的东西大多数都适用于c++,毕竟是基础么。[/quote] 最后那个a[10]什么用处

user: user-4
content: 引用 11 楼 stan_the_man 的回复:[quote=引用 9 楼 fefe82的回复:] #include<stdio.h> int findGreatestSubSum(const int a[],int size) {     if (size < 1) return 0;     int curSum = a[0];     int maxSum = a[0];     for(int i=1; i<size; i++) {         if (curSum > 0) curSum += a[i]; else curSum = a[i];         if (curSum > maxSum) maxSum = curSum;     }     return maxSum; } int main(void) {     int a[10]= {1, -2, 3, 10, -4, 7, 2, -5};     int max;     max=findGreatestSubSum(a,10);     printf(“%d\n”max);     return 0; } [/code] c语言的东西大多数都适用于c++,毕竟是基础么。

user: user-5
content: #define max(a, b) ((a)>(b)?(a):(b)) static int test_max_subrange_sum(int *array, int n) {     int i, max_sum, cur_sum;      if(n <= 0) {         return -1;     }      max_sum = cur_sum = array[0];      for(i = 1; i < n; i++) {         if(cur_sum < 0) {             max_sum = max(max_sum, cur_sum);             cur_sum = array[i];         } else { // cur_sum >= 0             if(array[i] >= 0) {                 cur_sum += array[i];             } else { // array[i] < 0                 max_sum = max(max_sum, cur_sum);                 if(cur_sum + array[i] > 0) {                     cur_sum += array[i];                  } else {                     cur_sum = array[i];                 }             }         }     }      max_sum = max(max_sum, cur_sum);      return max_sum; } 刚刚写的， 判断有些冗长，但貌似结果正确。应该有更简洁的吧。