爬楼梯问题/上台阶问题

这篇博客探讨了商汤科技笔试中的一道爬楼梯问题,即在有限的时间和内存限制下,如何有效计算n阶楼梯使用1或2阶步长的不同走法。文章介绍了三种方法:递归(易超时)、递推(空间换时间)和寻找数学规律(矩阵快速幂),并指出对于更大的步长m,需要进行算法优化以满足时间限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

商汤科技的笔试题。n阶,步长1~m,有时间和内存限制。

基础题:

n阶楼梯,每次能走1或2阶,问走到n阶一共多少种走法。

法一:递归 很容易超时

f(0)=1,f(1)=1,f(n)=f(n-1)+f(n-2)

#include <stdio.h>
#include <iostream>
#include<Windows.h>
using namespace std;

long long climbStairs(int n)
{
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else if (n > 2)
		return climbStairs(n - 1) + climbStairs(n - 2);
}

int main()
{
	long long stepCount = 0;

	DWORD start_time = GetTickCount();
	stepCount = climbStairs(45);  //40: 165580141 4.88s 45: 1836311903 53.99s
	DWORD end_time = GetTickCount();

	printf("%lld\n", stepCount);
	cout << "The run time is: " << (end_time - start_time) / 1000.0 << " s!" << endl;
	getchar();
	return 0;
}

法二:递推 用空间换时间,避免了重复计算,时间快了很多倍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值