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

相关推荐
Empty_7771 小时前
编程之python基础
开发语言·python
疯狂吧小飞牛2 小时前
Lua 中的 __index、__newindex、rawget 与 rawset 介绍
开发语言·junit·lua
Miraitowa_cheems2 小时前
LeetCode算法日记 - Day 73: 最小路径和、地下城游戏
数据结构·算法·leetcode·职场和发展·深度优先·动态规划·推荐算法
野蛮人6号2 小时前
力扣热题100道之560和位K的子数组
数据结构·算法·leetcode
Swift社区3 小时前
LeetCode 400 - 第 N 位数字
算法·leetcode·职场和发展
fengfuyao9854 小时前
BCH码编译码仿真与误码率性能分析
算法
Kratzdisteln4 小时前
【C语言】Dev-C++如何编译C语言程序?从安装到运行一步到位
c语言·c++
寻星探路4 小时前
Java EE初阶启程记13---JUC(java.util.concurrent) 的常见类
java·开发语言·java-ee
哲Zheᗜe༘4 小时前
了解学习Python编程之python基础
开发语言·python·学习
小白不想白a4 小时前
每日手撕算法--哈希映射/链表存储数求和
数据结构·算法