有趣的题目-二

给你N个数,要求在O(n)时间复杂度内求出在有序情况下,两个相邻数的最大差值。

what,既然要排序,怎么可能是O(n)。嘘,在这里要强调一下,所有基于比较的排序算法时间复杂度都是>O(nlogn)的。那不基于比较的排序-基数排序呢,那人家也是O(mn),不是O(n)。嗯。。别忘了咱们还有桶排序,而这题确实要借用到桶的思想。桶是什么?我们把桶抽象一下,当我们要将一组数排序的时候,不知道他们的大小关系之前,我们是绝对没办法排序的,但是,知道大小关系!=一定要比较。我们可以借助某些工具帮助我们,假设我们要比较i、j,现在我们知道的是i<x,j>y,x<y,你可能会说,根据>的传递性可以得到i<j,但是从这个例子我们可以发现一点,就算我们不知道i和j的大小关系,我们也可以通过其他的默认有序的东西来间接得到i和j的大小关系,这个工具就是桶。因为数组的索引是单调递增的,所以我们只要把数放入跟他同样大小的桶里,由于桶本身是有序的,因此只要遍历所有的桶,把数拿出来即可。当然,桶排的缺陷也显而易见,他要数组开辟的空间是与数据状况有关的,假设数据量少,数据的值跨度很大,那么桶排是不切实际的,甚至会发生数组开不下的情况,内存总是有限的。所以一般都把桶排的思想放在基数排序里,然而基数排序的复杂度是O(mn),回去了?No。看到这里应该明白,这题不能排序,但是要借助桶来做。

思路:首先呢,遍历一遍数组得到min和max,原本数组有n个元素,此时如果我们将min~max的跨度等分成n+1块,将原数组里的所有元素按找所属的块放进去,那么至少会有一个桶是空的。同时,桶之间是有序的,桶内无序。我们对每个桶维护一个桶内元素的min,max,对于每个桶i,如果它非空,那么这个桶能得到的最大邻近元素差值为这个桶的min与它左边最近的不为空的桶的max的差值。

猜你喜欢

转载自blog.csdn.net/qq_39304630/article/details/81609738
今日推荐