码迷,mamicode.com
首页 > 编程语言 > 详细

零子数组

时间:2015-04-08 14:49:01      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:求对于长度为n的数组a,求子数组的和接近0的子数组,要求时间复杂度O(nlogn)。

 

  1 #include <iostream>                                                         
  2 #include <algorithm>
  3 #include <math.h>
  4 
  5 using namespace std;
  6 
  7 int FindMinSubArry(const int a[],  int n)
  8 {
  9      int *sum = new int[n];
 10     //求数组a前N项和,并存于sum数组
 11     sum[0] = a[0];
 12     for(int i = 1; i < n; ++i)
 13     {
 14         sum[i] = sum[i - 1] + a[i];
 15     }
 16     int min1 = fabs(sum[0]);
 17     //数组a前N项和的绝对值的最小值min1
 18     for(int i = 1; i < n; ++i)
 19     {
 20         if(fabs(sum[i]) < min1)
 21         {
 22             min1 = fabs(sum[i]);
 23         }
 24     }
 25     sort(sum, sum + n);
 26     //求sum数组相邻元素的差的最小值min2
 27     int min2 = fabs(sum[0] - sum[1]);
 28     for(int i = 2; i < n; ++i)
 29     {
 30         if(fabs(sum[i] - sum[i - 1]) < min2)
 31         {
 32             min2 = fabs(sum[i] - sum[i - 1]);
 33         }
 34     }
35   delete [] sum;   
35 return (min1 > min2 ? min2 : min1); 36 } 37 38 int main(int argc, const char *argv[]) 39 { 40 int a[10] = {31, -41, 59, 26, -53, 58, 97, -93, -23, 84}; 41 int a2[5] = {-5, 2, 2, 3, 2}; 42 int min = FindMinSubArry(a, 10); 43 int min2 = FindMinSubArry(a2, 5); 44 cout << min << endl; 45 cout << min2 << endl; 46 return 0; 47 }

 结果如图:

技术分享

sum本身的计算和相邻元素差的计算,都是 O(N),sum的排序是O(NlogN),因此,总时间复杂度:O(NlogN) 。

零子数组

标签:

原文地址:http://www.cnblogs.com/bigshowxin/p/4402045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!