Google 2016 面试题 2 | 摆动排序 II

Google 2016 面试题 2 | 摆动排序 II

题目描述 

给出一个整数数组nums,重新排列nums使得nums[0] < nums[1] > nums[2] < nums[3]...

Example:

nums = [1, 5, 1, 1, 6, 4], 一个可能的答案是[1, 4, 1, 5, 1, 6]
数据保证必定有解。

分析解答

本题有一种简单的做法,先快速排序,然后把最小的一半依次放在奇数位上,最大的一半依次放在偶数位上。算法复杂度是快速排序的复杂度O(NlogN)。仔细思考后发现快速排序不是必要的,只需要找到中位数即可。利用快速排序的思想找中位数的期望时间复杂度是O(N)。为了防止相等的数放在一起,需要注意放置的顺序。笔者采用的方法是依nums长度分两种情况:若长度为奇数,把比中位数小的依次放在0,2,4,...位置,比中位数大的依次放在length-2,length-4,...位置;若长度为偶数,把比中位数小的依次放在length-2,length-4,...位置,比中位数大的依次放在1,3,5,...位置。其余位置填充中位数。这样可以保证中位数一定与较小与较大的数相邻(题目保证一定有解)。

参考程序



面试官角度分析

因为本题O(N)时间复杂度是额外要求,完成快速排序算法可以达到hire,给出O(N)算法和程序可以达到strong hire。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值