一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

news/2024/8/25 16:13:59
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵。不过实际上,在数字范围有限制的情况下,是有一个这样的算法的,只需要用一个数组记录每个数字出现次数就可以了。
假定你的数字范围在0到65535范围之内,定义一个数组count[65536](这个空间是常量,和n无关,所以是O(1) ),初值全部为0。
那么假设有下面这些数字:
100
200
300
119
0
6
...
那么对于每个这个数字,都做在count中记录一下:
100 => count[100]++
200 => count[200]++
300 => count[300]++
119 => count[119]++
0 => count[0]++
6 => count[6]++
...
最后,遍历一边所有这些数字就可得到0~65535每个数字的个数(在count数组中),然后再顺序遍历count数组,count[n] = m,则输出m个n,(比如说有count[3] = 2, 那么说明有2个数字3),依次输出,最后可得结果。第一次遍历是O(n),第二次遍历是O(1),为常量,所以最后的时间复杂度为O(n),而空间复杂度为O(1)
这个算法很简单,相信大家都会,只是这个题太过于变态了,一般会把面试者吓住(我原来面试也出过这个题,只不过题目的表述形式要“友善”的多,呵呵)




http://www.niftyadmin.cn/n/3658015.html

相关文章

Dynamic Convolution: Attention over Convolution Kernels 论文阅读笔记

这篇是CVPR2020的文章目的是用更轻量化的网络提供更高的性能因此采取了这样的结构,同一个层有多个卷积核,但是用attention网络组合成一个,这样增加了网络参数但是网络速度并没有多少降低

另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)

这个题貌似完全颠覆一般的Logic:交换两个整数需要一个额外的空间用于保存:t b;b a;a t;粗看上去似乎没有办法,但是仔细想一下,既然不能用额外的空间,那么能用的方法就只有数学方法,也许有效&#xff0c…

PAnet 论文阅读笔记

Path Aggregation Network for Instance Segmentation 网络结构如下,在FPN的基础上加了一个bottom-up path augmention,也就是b所表示的结构,此结构缩短了从最浅层大尺度特征图到最终用于检测的小尺度特征图的距离,按FPN的结构&a…

ACM UVa算法题209 Triangular Vertices的解法

有一段时间没有做ACM算法题目了,今天正好有空便随便挑了209题来做做:ACM UVa算法题#209题这道题有几个要点:1. 给定坐标系坐标系很容易定,我采用的是第一个点为(0, 0)点,X方向差别为2个单位,Y方向差别为1…

EfficientDet 论文阅读笔记

EfficientDet: Scalable and Efficient Object Detection 三点,一点是可学习权重的feature fusion;一点是新的scaleing method;一点是用了efficient net的结构 feature fusion,用BiFPN的结构 ,并且用带权重的fusion方…

M2Det论文阅读笔记

M2Det: A Single-Shot Object Detector based on Multi-Level Feature PyramidNetwork 文章提出了一种“更加高效”的multi-scale detection方法来应对目标的multi-scale问题,并取得了state of art的效果:网络结构如下:个人觉得文章写得很差…

我的MSDN Blog正式开张,欢迎大家访问 [ http://blogs.msdn.com/yizhang/ ]

我的MSDN Blog创建了其实有一阵子了,但是一直没有时间添加内容。这两天写了几篇文章(新的和在CSDN Blog上面发表过的,内容比较简单)放在上面。这个Blog主要是英文的内容,主要会和我在Microsoft的所进行的CLR开发工作有关系&#x…

Visual Studio 2005的JIT Debugger在Vista上面无法正常工作

Visual Studio 2005的Jit Debugger在Vista上不工作,即使你打了SP1和Update for Windows Vista也不行。修改Jit Debugger使其工作在Vista上需要大量的修改,因此这个工作被移到Visual Studio Code Name Orcas,也就是2007中去了。不过不排除微软…