九章算法面试题39 分割数组

来源:互联网 发布:php tp框架 编辑:程序博客网 时间:2024/04/28 11:06

九章算法官网-原文网址

http://www.jiuzhang.com/problem/39/


题目

给一个数组A,和一个整数k,将数组分成两个部分(你可以移动数组中的数),使得左边部分的数都<k,右边部分的数都>=k。要求使用O(1)的额外空间,和O(n)的时间。


解答

利用快速排序的思想。用两根指针i和j,一根指向头,一根指向尾,将头移动到第一个不满足A[i]<k的数,将尾巴移动到第一个不满足A[j]>=k的数,交换两个数,然后重复往下查找不满足A[i]<k和A[j]>=k的数,继续交换。直到两根指针碰头。python代码如下:


i, j = 0, len(A) -1

while i <= j:

while i < j and A[i] < k:

i += 1

while i < j and A[j] >= k:

j -= 1

if i <= j:

A[i], A[j] = A[j], A[i] #swap

i += 1

j -= 1


面试官角度

本题的考点是快排。如果写过快排或者明白快排的原理,很快就会明白这个题目只是快速排序中间的一个部分。两根指针一头一尾的这种方式,往期的题目中,第32题小球排序也是利用了类似的思路。读者可以将两个题目联系起来,找到共性,有利于思路的整理和归纳。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子在学校学习用具总是被偷怎么办 歌华有线欠费1个月怎么办 唐小僧倒闭了百姓投的钱怎么办? 手机号被别人注册了华为账号怎么办 华为账号手机号显示已被注册怎么办 买了鑫和陌车的怎么办 注册游戏账号时乱输入的邮箱怎么办 yy频道解邦不能开直播怎么办 淘宝的淘金币快过期了怎么办 乐透啦彩票让骗了6万怎么办 交了认筹金不能进抢购平台怎么办 爱奇艺会文学会员办了想退款怎么办 海淘信用卡入账但是砍单怎么办 褐色分泌物流了好几天了怎么办? 淘宝买的衣服一直不发货怎么办 从国外寄东西到国内被税了怎么办 百度网盘上传文件数量有限制怎么办 腾讯视频上传文件过限制大小怎么办 三星s7打网页又卡又慢怎么办 路由器的上网账号和口令忘了怎么办 小米笔记本移动热点连接不上怎么办 移动宽带密码重置后认证失败怎么办 移动光纤不记得账号和密码怎么办? 宽带为什么交了钱还是不能用怎么办 小孩被虎牙直播诱导支付了款怎么办 房间里4g网络信号差怎么办 移动4g网络信号不满格怎么办 大风号无法上传视频暂停服务怎么办 过了竞牌保证金交付时间怎么办 亚马逊产品上架后货物没到怎么办 工行企业网银证书过期了怎么办 海淘转运地址国家填错了怎么办 集装箱实重与申报重量不一样怎么办 微博复制的淘口令找不到了怎么办 买了移动手机不能用联通卡怎么办 移动手机用联通卡网速慢怎么办 移动手机插联通卡没反应怎么办 移动手机办了联通大王卡怎么办 qq被冻结但是有至尊宝怎么办 qq被冻结了有至尊宝怎么办 移动电话卡注销了里面的钱怎么办