免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5208 | 回复: 2
打印 上一主题 下一主题

[算法] 今日面试题:颠倒乾坤;及忘我之乘积题的分析 [复制链接]

论坛徽章:
8
巨蟹座
日期:2013-08-12 09:41:40IT运维版块每日发帖之星
日期:2015-12-09 06:20:00寅虎
日期:2013-12-25 14:59:40天秤座
日期:2013-12-06 14:04:55酉鸡
日期:2013-11-28 10:22:22水瓶座
日期:2013-08-26 15:40:54巨蟹座
日期:2013-08-12 09:42:01每日论坛发贴之星
日期:2015-12-09 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-01 09:14 |只看该作者 |倒序浏览
今日面试题:颠倒乾坤

在一棵二叉搜索树中,有两个节点颠倒了顺序。要求实现一个算法,在不改变树结构的前提下,恢复正确的二叉搜索树。给出一个空间为O(n)的实现很容易,那该如何给出一个空间O(1)的实现呢?

============================
忘我之乘积分析 http://bbs.chinaunix.net/thread-4093010-1-1.html
题目:

给你一个数组A[1..n],请你在O(n)的时间里构造一个新的数组B[1..n],使得B=A[1]*A[2]*...*A[n]/A。你不能使用除法运算。

分析:

看到题目,不要紧张,要头脑清晰,看穿面试官的本意,实际上,他是用除法公式,但又要求不用除法来迷惑你。

要求在不使用除法的情况下计算B=A[0]*…*A[n]/A,简单变换一下形式,即可得到B=A[0]*…*A[i-1]*A[i+1]*…*A[n],一共n-1次乘法。每一个B计算一遍,总的时间复杂度为O(n^2)。不符合题目要求,必须减少乘法的次数。如何减少乘法的次数呢?
继续分析,通过上面的变换,我们可以得到B是由两部分相乘得到的:
A[0]*…*A[i-1]
A[i+1]*…*A[n]
先看第一部分,在计算B[i+1]的时候,是可以利用B的第一部分结果的,只需要乘以A即得到B[i+1]的第一部分。
第二部分同理,计算完A[i+1]*…*A[n],再计算A*A[i+1]*…*A[n],只需要乘以A即可。A*A[i+1]*…*A[n]是B[i-1]的第二部分。
由此分析,构建两个新的数组:C和D(为了方便解释,用了两个数组),
C = A[0]*…*A[i-1] = C[i-1]*A[i-1]
D = A[i+1]*…*A[n] = D[i+1]*A[i+1}
构建C和D都是O(n)的时间复杂度(C从前到后遍历一遍数组,D从后到前遍历一边数组),然后,B = C*D也是O(n)的时间复杂度。整体算法的时间复杂度是O(n)。

题目到这解答完毕。

但是面试官的问题还没有完,他们会继续问,这个解法的空间是O(n)的,能够空间O(1)的情况下实现么?

首先看看一个只有5个数的数组,A[1],A[2],A[3],A[4],A[5]。

首先从头到尾遍历:

B[1] = A[1]
B[2] = B[1]*A[2]
B[3] = B[2]*A[3]
B[4] = B[3]*A[4]
B[5] = B[4], 临时变量 C=A[5]

然后从尾到头遍历:

B[4] = B[3]*C, C=C*A[4]
B[3] = B[2]*C, C=C*A[3]
B[2] = B[1]*C, C=C*A[2]
B[1] = C

通过这个小的例子,我们得到了算法,然后可以推广到任意多的元素。这个是面试中常用的技巧。

大家可以自己尝试把算法变成代码。

论坛徽章:
4
CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2014-02-26 16:47:00技术图书徽章
日期:2014-03-06 15:39:16技术图书徽章
日期:2014-04-24 15:56:22
2 [报告]
发表于 2013-08-01 12:45 |只看该作者
点评:
      不小心路过,发现lz打酱油打到此地了,此等博爱无疆的节操让本吊很是精呆了一下。在细看lz的内容,颇有c榴论坛的高级仿真风范,以YY精神为主,颠三倒四手法为辅。进行大面积铺撒文字,让众屌丝耐心受到考验,默默无言打开又效东施之颦退出。
      只是,本吊有点忍不住想吼一嗓子:不好好的在你的活动区里搞活动,跑这里搞毛,搞毛,搞5毛啊?!!。。。。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
3 [报告]
发表于 2013-08-01 13:24 |只看该作者
能不能搞点简单实用的算法啊,太高深的我们这平时工作用不到啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP