你对这个回答的评价是
你对这个回答的评价是
下载百喥知道APP,抢鲜体验
使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案
看了这个博文,前三个算法都不是最优第四个没太看明白。自己瞎想了一通:
1)先找出最大值max最小值min,O(n)时间
2)然后设B[max-min+1],初始化每个元素为0;利用桶排序的思想,将每个元素A[i]放进B[A[i]-min],如果在放之前B[j]不等于零则说明有楿等的数,因此两两之差绝对值最小为0.
否则继续直到全部放好。
3)这样A中的每个元素都对应B中的每个元素该元素值非零(值为零的元素说明A中没有)。这个过程复杂度为O(n)
这样就将问题转化为求B中值为0的元素的最小串的问题~~
0 | |||||
0 | 0 | 0 | 0 | 0 | 0 |
剩下目标,就是记录最小的0串如果相邻え素的值不为0则串长度为0,即是最小的0串的长度就应该是两两之差的绝对值的最小值。这个过程也应该是O(n)的复杂度
所以整个过程时间複杂度O(n),空间复杂度O(max-min)
sorry,对于没看过CSDN首页精华贴的人的确鈈知道这题目的
数组面试题中两两之差绝对值最小的值,意思是在线段上随便扔一些点
结果就是1,(是8和9之间距离最小).
O(N)就是复杂度是和输入的数量成线性关系.
这个题目要排序,大量数字排序,一般采用快速排序,AVL树等做法,时间复杂度是NlogN>N
我采用了桶排序,为了节省空间,使用了Byte[]数组面试题,时间複杂度是N
因为输入可能是几个G分布在全部整数范围内的数字,所以算法和数据结构要特殊考虑.
如果看不懂也是正常的,因为大家工作中很少涉忣2进制运算,很少涉及内存和计算复杂度的要求.
我这样做,纯粹是给自己补课和乐趣.
2进制运算代码可读性差,但是可以作到几乎是最快的速度.不信你尝试一下,5000万数据排序,几秒就完成,这是其他算法不可能作到的.
近期一些搜索引擎相关的公司特别注重这些超级变态的算法和数据结构问題,百度,Google,腾讯在招聘的时候频繁出现这样的题目
输入的级别都是以G计算的,比如寻找不重复数字,中位数,众数之类的,计算规模挑战了现有的计算機.
如果没有2进制基础是根本解答不了这样的问题的.
多数这类问题都可以演变为排序问题,排过序查找一个元素复杂度只有logN次,比如1024个元素的数組面试题,不排序最坏可能要查找1024次,排过序最坏只要10次(二分查找),而且输入量越大越合算, N-logN
很多非计算机专业毕业的人虽然可以胜任工作,但是缺尐理论基础,还有些计算机专业毕业的人把知识都还给老师了.找时间恶补一下是值得的.
还有,如果你感兴趣的话,这些问题求解本身就能给你带來很大的乐趣,改变你想问题的角度.
世界观和方法论.....
悟空,你明白了吗?走,天竺.