2019-01-14

经典数据结构题(一)

1、排序问题
有一个整形数组A,请设计一个时间复杂度为O(n)的算法,算出排序后相邻两数的最大差值。给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素个数大于等于2小于等于500。
测试样例:
[9,3,1,10],4 返回:6
思路:先排序,再遍历数组求出相邻2个数的差,保留最大值即可,此时时间复杂度为O(nlogn)。由于非线性时间比较类排序时间复杂度不能突破O(nlogn),因此使用桶排序的思想,对于n个数,设置n+1个桶,具体的,先遍历数组找出min和max,差值区间设置为d=(max-min)/n,于是区间是[minmin+d);[min+dmin+2d)……[min+(n-1)d~min+nd)这n区间,再单独为最大值max设置一个桶,于是得到n+1个桶,已知数组元素总共有n个,但是桶有n+1个,并且元素min必定在第一个桶中,max必定在n+1号桶中;显然要把n个元素放入到n+1个桶中必定会产生空桶,已知数组中的元素时整数,而虽然每个桶区间不一定是整数,例如[23/7,31/7),但是没有关系,对于任意一个元素,它总会落入到某一个桶中,并且可以知道,不同桶之间元素的差值必定大于d,同一个桶中的元素的差值必定小于d,于是可知要求元素之间的最大差值只需要在不同的桶之间寻找,不用在同一个桶中寻找,并且题目要求是排序后相邻2个元素的最大差值,于是应该寻找2个相邻非空桶中前一个桶的最大值与后一个桶的最小值之间的差值,遍历所有桶,比较得到所有差值中的最大值就是结果所要求的相邻2数最大差值。

注意理解:最终要对每2个非空的相邻的桶求差值,而不能根据空桶的数目来确定2个相邻桶的差值,因为桶的长度可能是小数,那么间隔2个空桶和间隔3个空桶并不意味着后者具有更大的差值,因此应该对所有相邻的非空桶根据前桶的最大值和后桶的最小值求出差值作为比较对象,因此在遍历时对于每一个桶,要求出这个桶中元素的最大值maxOfBucket[i],最小值minOfBucket[i],并且保留上一个非空桶的maxOfLastBucket,于是差值着2个相邻非空桶的差值就是result= minOfBucket[i]- maxOfLastBucket;然后将当前桶的maxOfBucket[i]最为下一个桶的maxOfLastBucket。逐步替换result,当遍历完成时就可以得到最大差值。

int getBucketID(int num ,int min, int max,int n){
      return (int) (num - min) *n /(max - min);
}
int maxGap(int A[],int n){
    int maxValue = A[0];
    int minValue = A[0];
    for (int i = 0; i < n; i++) {
        if (maxValue < A[i])maxValue = A[i];
        if (minValue > A[i])minValue = A[i];
    }
    int* mins = (int*)malloc(sizeof(int)*(n + 1));
    int* maxs = (int*)malloc(sizeof(int)*(n + 1));
    int* hasNum = (int*)malloc(sizeof(int)*(n + 1));
    for (int k =0 ; k < n + 1; k++) {
            hasNum[k] = 0;
    }
    int bucketID = 0;
    int i = 0;
    for (;i < n; i++) {
        bucketID = getBucketID(A[i],minValue, maxValue,n);
        if (hasNum[bucketID] == 1) {
            if (mins[bucketID] > A[i]) {
                mins[bucketID] = A[i];
            }
            if (maxs[bucketID] < A[i]) {
                maxs[bucketID] = A[i];
            }
        }else{
            mins[bucketID] = A[i];
            maxs[bucketID] = A[i];
        }
         hasNum[bucketID] = 1;
    }
    int maxGap = 0;
    int lastMax = 0;
    i = 0;
    while (i < n + 1) {
         //找到一个空桶,记录下前一个桶的最大值
        while (i < n + 1 && hasNum[i] == 1) {
            i++;
        }
        if (i == n + 1)break;
        lastMax = maxs [i-1];
        while (i < n + 1 && hasNum[i] == 0) {
            i++;
        }
        if (i == n + 1)break;
        if (maxGap <= mins[i] - lastMax) {
            maxGap = mins[i] - lastMax;
        }
    }
   free(mins);
   free(maxs);
   free(hasNum);
    return maxGap;
}

2、最大差值
有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。 给定数组A及它的大小n,请返回最大差值。
测试样例: [10,5],2 返回:0
思路: 从后向前和前边的最小数的差值,记录下来。最后遍历记录的数值找最大的。

int maxDivision(int A[],int n){
   int maxValue = 0;
   int minValue = A[0];
   int temp;
   for (int i = 1;i < n;i++) {
       if ((temp = A[i] - minValue) > maxValue) {
           maxValue = temp;
       }
       if (minValue > A[i]) {
           minValue = A[i];
       }
   }
   return maxValue;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 该文章总结自牛课网的在线算法课程(https://www.nowcoder.com/) 经典排序算法就是前面讲那几...
    锅与盆阅读 7,702评论 6 14
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,762评论 0 2
  • 七、物质宇宙的大小及年龄 1、从物质粒子的大小看微观宇宙有多小 ⑴物质由分子组成 在宇宙中的一切物质均由分子组成。...
    宇宙形成阅读 880评论 0 0
  • 我一直都否定自己的能力,一直觉得自己不行。很多事情在没有做之前,我在潜意识已经否定了自己,认为自己不行。 322+...
    渺晓小小阅读 1,076评论 0 0
  • 2018年3月21日 星期三 阴,低温 今天的气温着实低! 早上醒来第一件事,是偷偷在娃家长群里问问老师,今天学...
    木徒阅读 258评论 0 0