zoukankan      html  css  js  c++  java
  • 数组的最大间隔

    数组的最大间隔:

    给定整数数组A[0...N-1],求这N个数排序后的最大间隔。要求时间复杂度为O(N)。

    如:数组:1,7,14,9,4,13。

    排序后:1,4,7,9,13,14。最大间隔为4。

    问题分析:

    如果对原数组排序,然后后项减前项的最大值,即为所求解。但是时间复杂度为O(nlogn)。这里借鉴桶排序或hash映射的思想。

    程序实现:

     1 /***************************************
     2 FileName CalcMaxGap.cpp
     3 Author : godfrey
     4 CreatedTime : 2016/5/4
     5 ****************************************/
     6 #include <iostream>
     7 #include <cstring>
     8 #include <vector>
     9 #include <algorithm>
    10 #include <stdio.h>
    11 #include <stdlib.h>
    12 
    13 using namespace std;
    14 
    15 typedef struct tagSBucket{
    16     bool bValid;
    17     int nMax;
    18     int nMin;
    19 
    20     tagSBucket():bValid(false) {}
    21 
    22     void Add(int value){
    23         if(!bValid){
    24             nMax = nMin = value;
    25             bValid = true;
    26         }
    27         else{
    28             if(nMax < value)
    29                 nMax = value;
    30             else if(nMin > value)
    31                 nMin = value;
    32         }
    33     }
    34 }SBucket;
    35 
    36 int CalcMaxGap(int* A,int size){
    37     SBucket* pBucket = new SBucket[size];
    38     int nMax = A[0];
    39     int nMin = A[0];
    40     int i;
    41     //获取最值
    42     for(i=1;i<size;i++){
    43         if(nMax < A[i])
    44             nMax = A[i];
    45         else if(nMin > A[i])
    46             nMin = A[i];
    47     }
    48     //将数组中的数据平均分到size个桶中
    49     int diff = nMax - nMin;
    50     int nBucket;
    51     for(i=0;i<size;i++){
    52         nBucket = (A[i] - nMin) * size / diff;
    53         if(nBucket >=size)
    54             nBucket = size-1;
    55         pBucket[nBucket].Add(A[i]);
    56     }
    57     //获取有效桶的最大间隔
    58     i = 0;
    59     int nGap = diff / size;//最小间隔
    60     int Gap;
    61     for(int j = 1;j<size;j++){//j是当前桶,i是上一个桶
    62         if(pBucket[j].bValid){
    63             Gap = pBucket[j].nMin - pBucket[i].nMax;
    64             if(Gap > nGap)
    65                 nGap = Gap;
    66             i = j;
    67         }
    68     }
    69     delete[] pBucket;
    70     return nGap;
    71 }
    72 int main()
    73 {
    74     int a[] = {1,4,7,9,13,14};
    75     int size = sizeof(a)/sizeof(int);
    76     for(int i=0;i<size;i++){
    77         cout<<a[i]<<" ";
    78     }
    79     cout<<endl;
    80     int MaxGap = CalcMaxGap(a,size);
    81     cout<<"-----------After Calculation ------------"<<endl;
    82     cout<<"The Max Gap : "<<MaxGap<<endl;
    83     return 0;
    84 }

    运行结果:

    说明:求最值,平均分割桶的数据,最后求最大间隔时间复杂度分别为O(n)。最后时间复杂度为O(n)。

    转载请注明出处:

    C++博客园:godfrey_88

    http://www.cnblogs.com/gaobaoru-articles/

    转载请注明出处: C++博客园:godfrey_88 http://www.cnblogs.com/gaobaoru-articles/
  • 相关阅读:
    Objective-C多线程-02
    Objective-C多线程-01
    Objective-C的属性与实例变量
    KVO的内部实现原理
    ASIHTTPRequest 和 AFNetWorking 的比较
    Python类和函数_规划式开发
    禁用密码登录,改用key秘钥对登录
    Python类和函数_时间与纯函数
    Python类和对象_调试与术语
    Python类和对象_修改和复制
  • 原文地址:https://www.cnblogs.com/gaobaoru-articles/p/5460195.html
Copyright © 2011-2022 走看看