面试题:如何 O(n) 的复杂度内筛选 60 亿人的身高

查看 682|回复 81
作者:Daredevil0086   
完整的题目差不多是这样的:
现在有一个文件 a.txt ,其中放的内容就是 60 亿人的身高,每个身高数据都保证是以.0 或者.5 结尾的(比如说 180.0 ,175.5 );现在请筛选出其中前 1000 高的数据;
要求时间复杂度是 o(n);
面试官说这玩意不是一个单纯的算法,身高数据可以做点文章……但到最后还是没想出来………………有没有高智商 V 友可以解答一下

身高, 筛选, 复杂, 数据

fengjianxinghun   
感谢各位高智商 V 友的各种回答和意见,感觉基本确定了答案就是 1L 和 6L 的方案就是面试官想要的~~~
总之,千言万语汇成一句话:
家人们,爱你啾咪❤,mua~~
lolizeppelin   
人类的身高是有上下限的,正确点说就是 0.5-3 米之间,而且他保证了是.0/.5 结尾,就减少到一个更小的数值集合,这样想你是不是就懂了?
iamzuoxinyu   
遍历的时候超过 2 米的.....或者低一点 1.95
Nugine0   
桶排序
Daredevil0086
OP
  
基数排序
leogm9408leo   
@iamzuoxinyu 桶排序最差能到 O(n^2)吧,不在 O(n)内
devfeng   
数据是以.0 或者.5 结尾,意味着这是个有范围的离散数据而不是连续数据。假设人类的身高区间是 10 厘米-250 厘米,间距 0.5 厘米,其实也就( 250-10 )*2=480 个。作 480 个数据桶,遍历一遍就可以把 60 亿数据都放到这 480 个数据桶里,然后取不为空的最大身高值的桶里的数据即可
edward1987   
https://leetcode.cn/problems/kth-largest-element-in-an-array/ 第 k 个最大元素,思路是一样的
Daredevil0086
OP
  
前 1000 高的,又不是所有都排序,用一个数组存当前最高的 1000 个,遍历一遍,遇到更高的就替换数组内容就好了啊。复杂度就是 0(n)
您需要登录后才可以回帖 登录 | 立即注册

返回顶部