新浪实习生面试题

200个数组,每个数组100个已排好序的数(从大到小),求出最大的20个数;复杂度。

方法一:

1、200个数组第一个数快排从大到小排好;200log200

2、​取出排好序的第一元素为最大元;

3、将最大元所在数组第二个数取出,折半查找插入相应位置;log200

4、重复2、​3,直到找到20个为止。 19log200

所以时间复杂度为219log200​ 空间复杂度200

方法二:(面试完之后想的)

1、先对200个数组第一个元素的前20个元素快排排好; 20log20

2、将剩下的180个元素插入20个已排好序的数组中,原则:先与20个最大元中的最小元比较,如果大于,则折半查找插入,反之,进行下一个; 180log20

3、按照方法一中的2、3​找出前20个最大元。(这里只需考虑最大20-i+1元所在数组,i为将取出第i个最大元)log19+log18+…+log3+2+1<19log20

所以​时间复杂度小于219log20 空间复杂度20

方法三:(本以为方法二已经很完美了,结果发现还有复杂度更小的,顿感算法之奥妙)

1、先将200组数分成n组,每组m个​,其中n*m=200;

2、对n组元素每组均进行排序(指排第一大);​ 每组复杂度mlogm,则共n*mlogm=200logm;

3、对n组中第一大元素进行排序;nlogn

4、按照方法二中的3步取出最大的20个;19logn

复杂度:200logm+nlogn+19logn=200log(200/n)+(n+19)logn=200log200+(n-181)logn;求导求上述最小值,得到n=25时最佳。

即分成25组,每组8个。为200log200-156log25

​​空间复杂度 25

这是我想到的三种个方法,自己能力有限,菜鸟一枚,欢迎大家给出更多好的方法。​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值