CrackingtheCodeInterview之递归和动态规划

NO.1 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一个方法,计算小孩有多少种上楼梯的方式。

解法:试想小孩在上到第n阶台阶前可能选择了一次上几阶台阶,1/2/3都有可能,所以子问题是第n-1阶台阶、第n-2阶台阶和第n-3阶台阶这些方法的和。因此,按照这种递归去解决问题即可,时间复杂度为O(3^n)。采用动态规划的方法可以避免重复的计算,保存每一层台阶实现的方法,同时也可以采用迭代取代递归,这样能提高程序的时间及空间效率。

NO.2 设想有个机器人坐在X*Y网格的左上角,只能向右、向下移动。机器人从(0,0)到(X,Y)有多少种走法?

进阶

假设有些点为“禁区”,机器人不能踏足。设计一种算法,找出一条路径,让机器人从左上角移动到右下角。

基础解法:机器人需要往下走X步,向右走Y步,总共X+Y步,所有的走法可以看做是X和Y的顺序安排种类,等价于计算从X+Y步方法中选择X步向下走的方法的位置总共多少种情况,共有(X+Y)!/((X!)*(Y!))种情况。

进阶解法:增加一些禁区点,那么问题如果还按照基础解法的思维就很难去解决,采用动态规划的思想,P(i,j)=P(i-1,j)+P(i,j-1),if (i,j)不是禁区,若是禁区直接赋值为0,这样问题就可以轻松解决。

NO.3 在数组A[0...n-1]中,有所谓的魔术索引,满足条件A[i]=i。给定一个有序整数数组,元素值各不相同,编写一个方法,在数组A中找出一个魔术索引,若存在的话。

进阶

如果数组元素有重复值,又该如何处理?

基础解法:蛮力法当然可以解决这个问题,更好的方法还有哪些?因为数组条件为有序,所以利用有序条件,我们比较中间值是否为魔术索引,实现二分查找。若中间值小于序号,则左侧所有的元素都不是魔术索引,直接判断右侧的魔术索引,使用递归方法来实现。

进阶解法:若元素有重复值,以上方法就不使用了,不能通过简单的中值比较进行二分,不过我们还是可以能够去除一部分不可能为魔术索引的位置从而提高效率。

NO.4 编写一个方法,返回某集合的所有子集。

解法:使用递归或者迭代进行求解,没增加一个元素,新增的子集就是在原有的子集上增加最后一个元素,数量增长一倍。

NO.5 编写一个方法,确定某字符串的所有排列组合。

解法:递归f(n)就是f(n-1)字符串中取某一位置插入第n个字符,该方法的时间复杂度为O(n!)。

NO.6 实现一种算法,打印n对括号的全部有效组合(即左右括号正确配对)。

解法:第一种方法f(n)等于f(n-1)中选择一个左括号的后面插入一个完整的左右括号,然后去除重复即可,递归实现。第二种方法,类似于创建字符串,要求左括号的数目大于等于右括号的数目,当大于时,递归两种加入左括号或者右括号的方法,当等于时,递归一种加入左括号的子方法。

NO.7 编写函数,实现许多图片编辑软件都支持的“填充颜色”功能。给定一个屏幕(以二维数组表示,元素为颜色值)、一个点和一个新的颜色值,将新颜色值填入这个点的周围区域,直到原来的颜色值全都改变。

解法:判断上下左右四个格子颜色是否与目标颜色相同,若相同就结束,若不同就递归调用该点的填充颜色函数。

NO.8  给定数量不限的硬币,市值为25分、10分、5分和1分,编写代码计算n分有几种表示法。

解法:采用一种递归的思想,首先判断25可以取多少种,针对每一种递归判断10可以取多少种,再递归判断5可以取多少种,最后递归负责补全所有的1,递归结束,可以使用静态变量统计表示方法的数量。

NO.9 设计一种算法,打印八皇后在8*8棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

解法:递归判断每一行皇后可能的位置,对于合理的位置继续使用递归即可。

NO.10 给你一堆n个箱子,箱子宽wi高hi深di。箱子不能翻转,将箱子堆起来时,下面箱子的宽度高度和深度必须大于上面的箱子。实现一个方法,搭出最高的一堆箱子,箱堆的高度为每个箱子高度的总合。

递归解法:找到每个以n为底能堆出的最大序列,若第二个箱子为x,在递归判断以x为底的最大序列,一直到不能再往上堆。

动态规划解法:递归算法存在大量的重复计算,效率较低,所以每次计算完以x为底的最大序列就保存起来,以备下次使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值