面试100题-1

面试题100题——1 求最大子数组之和
(转自何海涛大神的博客http://zhedahht.blog.163.com/blog/static/254111742007219147591/)
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或者多个整数组成一个子数组,每个子数组有一个和,求所有子数组的和的最大值,要求时间复杂度是0(n)
 
example:数组为[1,-2,3,10,-4,7,2,-5] 和最大的子数组为[3,10,-4,7,2]
        输出为最大子数组的和18
 
思路:1.题目是之前的常见题,和动态规划有关
      2.最直观的思路是比较所有的子数组的和,但是长度为N的数组有N+N-1+N-2+....1=               (N+1)*N/2(因为是要求连续的整数组成的子数组),复杂度上是O(n2),同时求一个长度为       N的数组的和的时间复杂度为O(n),总体的时间复杂度为O(n3)
      3.整数可以累加,但是负数会减少总体的和的大小,所以遇到负数是应该摒弃(如果都是负         数,则默认更新最大的那个负数即可)
 
Code:
 
  
  
  
  
  1. #include<iostream> 
  2. #include<limits.h> 
  3. //#define INT_MIN 0x80000000; 
  4.  
  5. using namespace std; 
  6.  
  7. //int GetMaxSubArray(int *numbers, int length) { 
  8. bool GetMaxSubArray(int *numbers, int &greatsum, int length) { 
  9.     if(numbers == NULL || length <= 0) 
  10.                //return 0; 
  11.                return false
  12.      
  13.     int cursum = 0; 
  14.     //int greatsum = INT_MIN; 
  15.     for(int i = 0; i < length; i++) { 
  16.         cursum += numbers[i]; 
  17.          
  18.         if(cursum > greatsum) 
  19.                   greatsum = cursum; 
  20.          
  21.         if(cursum < 0) 
  22.                   cursum = 0; 
  23.         cout << "cursum is :" << cursum << "----" << "greatsum is :" << greatsum << endl; 
  24.     } 
  25.     //return greatsum; 
  26.     return true
  27.  
  28. int main() { 
  29.     int numbers[8] = {0,-2,-3,-10,-4,-7,-2,-5}; 
  30.     int length = sizeof(numbers)/sizeof(numbers[0]); 
  31.     int greatsum = INT_MIN; 
  32.      
  33.     if(GetMaxSubArray(numbers, greatsum, length)) 
  34.         cout << "Great Subnumbers sum is :" << greatsum << endl; 
  35.     else 
  36.         cout << "Function Faild" << endl; 
  37.          
  38.     system("pause"); 
  39.     return 0; 
  40.     } 
 
这里有几个需要注意的地方: 
1.头文件limits.h中包含有当前32位整数所能表示最小的负数INT_MIN,这种情况是为了应对都是原数组元素都是负数的情况,
不需要再开一个for循环遍历一次数组。(感谢大神博客网友haizidu) 
 
2.开始的时候GetMaxSunArray的返回值就是要求输出的最大和,
但是经过作者的分析,如果返回0的话,貌似无法区分究竟是因为数组空还是因为恰好最大子数组的和就是0
所以采用传引用参数的方式,同时返回值设为bool形式,这一点需要注意和学习。    

你可能感兴趣的:(算法,面试)