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)) 这句代码也多余。 代码略。

相关推荐
jerryinwuhan10 分钟前
《Python数据预处理》第四章
开发语言·python
长江&后浪12 分钟前
防火墙的描述
开发语言·网络·php
观无33 分钟前
若依EasyExcel实现单元格合并
开发语言·前端·javascript
雨晨源码(同名B站)35 分钟前
基于Python的网易云音乐评论数据情感化分析系统 音乐爬虫信息可视化 |SnowNLP评论情感分析
开发语言·hadoop·爬虫·python·信息可视化·毕业设计
间歇性努力持续性发呆的野生快乐选手39 分钟前
栈的性质(进栈,出栈,访问)
数据结构·c++
我不是疯子是傻子1 小时前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
m0_547486661 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
程序员老陆1 小时前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
旖旎夜光1 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
霸道流氓气质1 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式