164Maximum Gap

来源:互联网 发布:北京行知实践园有感 编辑:程序博客网 时间:2024/05/16 10:15

164 Maximum Gap

链接:https://leetcode.com/problems/maximum-gap/
问题描述:
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

Credits:
Special thanks to @porker2008 for adding this problem and creating all test cases.

Hide Tags Sort

这个问题是求排序好之后的数列中相邻数字之间最大的差值。一开始我想的最简单的解决方法是使用二分法排序,最后遍历一边找个最大值就可以。

void msort(int *a,int size){    int key=a[0],i=1,j=size-1;     if(size<=1) return ;     while(i!=j)     {        while(key<a[j]&&j>i)            j--;        while(a[i]<=key&&i<j)            i++;        if(i!=j)        {          int k=a[i];          a[i]=a[j];          a[j]=k;        }     }     if(a[j]<key)          {          a[0]=a[i];          a[i]=key;          }      msort(a,i);      msort(a+i,size-i);}int maximumGap(int* nums, int numsSize) {    int result=0,i;    if(numsSize<2)        return 0;    msort(nums,numsSize);        for( i=0;i<numsSize-1;i++)        {           if(nums[i+1]-nums[i]>result)               result=nums[i+1]-nums[i];        }        return result;}

这个问题还可以用桶排序解决。桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(O(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。简单理解就是将数据分段,分段之后对每个段进行排序,最后合并每个段就可以了。在这个问题可以借鉴这个思想。
1.假设数组有N个元素,数值从Vmin到Vmax。
2.那么最大的差值不会小于(Vmax-Vmin)/N。
3.引入桶排序,设置桶的大小为(Vmax-Vmin)/N=Size,那么桶的个数是(Vmax-Vmin)/Size+1,每个数属于哪个桶也就能确定了,index=(num-Vmin)/Size。
4.因为每个桶内的大小为Size,那么桶内元素之间最大差值为Size-1,又因为最大的差值不会小于(Vmax-Vmin)/N。所以最大的差值一定出现在桶与桶之间。
5.如果桶内有元素则求得桶的最大值和最小值,那么差值可以通过连续两个又元素的桶中后一个桶的最小值减去前一个桶的最大值求得。
6.遍历所有桶,取差值最大就可以解决问题。这里需要注意的是可能有的桶里面没又元素。

int maximumGap(int* nums, int numsSize) {    int max=-2147483648,min=2147483647,size,numofmap,i,j, *maxmap,*minmap,result=0;    if(numsSize<2)        return 0;    for( i=0;i<numsSize;i++)    {        max= max<nums[i]?nums[i]:max;        min= min>nums[i]?nums[i]:min;    }    size=(max-min)/numsSize;    if(size==0)        return (max-min);    numofmap=(max-min)/size+1;    maxmap=(int *)malloc(sizeof(int)*numofmap);    memset(maxmap,0x80,sizeof(int)*numofmap);    minmap=(int *)malloc(sizeof(int)*numofmap);    memset(minmap,0x7f,sizeof(int)*numofmap);        for( i=0;i<numsSize;i++)        {            if(maxmap[(nums[i]-min)/size]<nums[i])                maxmap[(nums[i]-min)/size]=nums[i];            if(minmap[(nums[i]-min)/size]>nums[i])                minmap[(nums[i]-min)/size]=nums[i];        }        for( i=0;i<numsSize-1;)        {            j=i+1;            while(maxmap[j]<minmap[j])            j++;            if(result<minmap[j]-maxmap[i])                result=minmap[j]-maxmap[i];            i=j;        }        return result;}
0 0
原创粉丝点击