面试中的算法

面试中的算法

1.卡特兰数问题

Catalan数的定义:
令h(0)=1,h(1)=1,catalan数满足递推式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2)

递推式可表示为:
h(n)=h(n-1)*(4*n-2)/(n+1);

递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,…)
  • 应用:

1.买票找零
 有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

 题目另一种形式:有n对左括号和右括号,现在问到底有多少中括号合法匹配的组合?

2.12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

应用公式:c(2n, n)/(n+1)。

而c(12, 6)/7 = 12*11*10*9*8*7/(7*6*5*4*3*2) = 132

注意:c(2n, n)/(n+1) = c(2n, n) - c(2n, n-1)

3.括号化

矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?

h(n-1)种

4.出栈次序

一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?

输出序列的总数目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)=h(n)。

5.凸多边形三角划分

在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。

f(n)= h(n-2) (n=2,3,4,……)

6.一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

7.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

8.给定N个节点,能构成多少种不同的二叉搜索树?

( 能构成h(N)个) (这个公式的下标是从h(0)=1开始的)

2.斐波那契数列问题

定义:
这组数列是1,1,2,3,5,8,13,21,34,55,89,144,……,以至无穷。这组数列由1开头,随后紧接一个1,前两个数字相加,1+1得出第三个数是2,然后第二个数与第三个数相加,1+2得出第四个数是3。紧接着,第三个数与第四个数相加,2+3 得出第五个数是 5。以此类推。而斐波那契数列中相邻两项之商就接近黄金分割数0.618,这组数列成为斐波那契数列。

  • 应用
    1.排列组合
     有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?
    最后一步:要么从8往上走2级,要么从9往上走1级;故f(10) = f(9)+f(8)
    到达1,向上爬一级;f(1)=1
    到达2,从1向上爬一级;直接向上爬两级;f(2)=2

解法:

  • 递归:
    public int climbStairs(int n) {
    return n==1||n==2?n:climbStairs(n-1)+cimbStairs(n-2)
    }
  • 备忘录算法
  • 动态规划算法
  • 状态压缩法(又称滚动数组或滑动窗口)减少变量,用于优化动态规划的空间复杂度

2.兔子繁殖问题
 一般而言,兔子在出生三个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数
总体对数=本月成兔对数+本月幼仔对数
可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值