【数据结构和算法面试题】跳台阶问题

题目来源“数据结构与算法面试题80道”。
这里写图片描述

问题分析:假设 f ( n ) f\left ( n \right ) f(n)为跳台阶的总跳法,当 n = 1 n=1 n=1时, f ( n ) = 1 f\left ( n \right )=1 f(n)=1;当 n = 2 n=2 n=2时, f ( n ) = 2 f\left ( n \right )=2 f(n)=2;当 n = 3 n=3 n=3时,如果先跳1级台阶,有 f ( n − 1 ) = f ( 2 ) f\left ( n-1 \right )=f\left ( 2 \right ) f(n1)=f(2)种方法,如果先跳2级台阶,有 f ( n − 2 ) = f ( 1 ) f\left ( n-2 \right )=f\left ( 1 \right ) f(n2)=f(1)种方法,依次类推,可以得到下面的递推公式:

f ( n ) = { 1  if  n = 1 2  if  n = 2 f ( n − 1 ) + f ( n − 2 )  if  n > 2 f\left ( n \right )=\begin{cases} 1 & \text{ if } n=1 \\ 2 & \text{ if } n=2 \\ f\left ( n-1 \right )+f\left ( n-2 \right ) & \text{ if } n>2 \end{cases} f(n)=12f(n1)+f(n2) if n=1 if n=2 if n>2

方法:

int get_kind(int n){
	if (n <= 0) return 0;
	
	int result;
	int *cal = (int *)malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++){
		if ((i + 1) == 1) cal[i] = 1;
		else if ((i + 1) == 2) cal[i] = 2;
		else {
			cal[i] = cal[i-1] + cal[i-2];
		}
	}
	result = cal[n-1];
	free(cal);
	return result;
}

时间复杂度为O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值