leeCode 70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

复制代码
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

复制代码
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45

代码:

cpp 复制代码
int climbStairs(int n) { // leeCode 70.爬楼梯
	if (n == 1)
		return 1;
	if (n == 2)
		return 2;
	// 最后一步只有两种可能,跨1步或跨2步,这两种可能看作为互斥事件,将这俩种走法方法数加起来就是答案。
	// 设爬到n层阶梯所需方法数为f(n)
	// 先跨到n-1层,再从n-1层跨1层到n层,方法数为f(n - 1); 同理先跨到n-2层,再从n-2层直接跨2层到n层,方法数为f(n - 2)
	// 因为这俩种方案互斥,所以f(n) = f(n-1) + f(n-2);
	// f(1) = 1, f(2) = 2, 可以根据f(1)、f(2)的值算出f(3),同理可以再算出f(4)..., 一直算出f(n)
	int* f = (int*)malloc((n + 1) * sizeof(int)); // 需要求f[n], 所以数组有n + 1个元素
	if (f == NULL) {
		printf("malloc, error happend");
		return 0;
	}
	memset(f, 0, sizeof(f)); // 注意:设置的值会转化为 unsigned char ,int数组可以这样初始化0,其他值不要这么设置。
	*(f + 1) = 1;
	*(f + 2) = 2;
	for (int i = 3; i <= n; i++) {
		*(f + i) = *(f + i - 1) + *(f + i - 2);
	}
	int res = *(f + n);
	free(f);
	return res;
}

测试代码:

cpp 复制代码
void testLeeCode70() {
	int n;
	printf("请输入台阶数: ");
	int res = scanf_s("%d", &n); // scanf函数不安全,这里用scanf_s函数
	if (res == 1) { // 一个参数获取到值
		printf("%d\n", climbStairs(n));
	}
	else {
		printf("输入不符合预期");
	}	
}

打印结果:

ok

提交到LeeCode:

内存偏高,只击败5%,有点尴尬😂,可能是因为是用数组存储 f(n)函数各个参数对应的函数值,可以优化为只用几个变量,减少内存消耗,memset(f, 0, sizeof(f)) 这句代码也多余。 代码略。

相关推荐
凡人叶枫7 分钟前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp8 分钟前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的32 分钟前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉1 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉1 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
青山木1 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
徐小夕2 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
凡人叶枫2 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员2 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean2 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务