当前位置: 首页 > news >正文

leeCode 70. 爬楼梯

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

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

示例 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

代码:

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;
}

 测试代码:

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

相关文章:

  • Java单例模式中的饿汉模式和懒汉模式
  • 使用ES支持树状结构查询实战
  • SQLite 查询数据库属性
  • 一道积分_3
  • Linux多线程
  • Java 大视界 -- 基于 Java 的大数据机器学习模型的可扩展性设计与实践(149)
  • 使用 Python 开发 MCP Server 及 Inspector 工具详解
  • 【2025 华中师范大学-菜鸟杯程序设计竞赛】部分题解
  • 多模态工作idea讨论
  • HTTPS协议—加密算法和中间攻击人的博弈
  • 【Dive Into Stable Diffusion v3.5】2:Stable Diffusion v3.5原理介绍
  • Baklib驱动企业数字化内容管理升级
  • WebSocket接入SSL证书
  • Java面试黄金宝典11
  • 数据库锁机制
  • 《Oracle DBA入门实战:十大高频问题详解与避坑指南》
  • 智能飞鸟监测 守护高压线安全
  • 使用 Go 构建 MCP Server
  • 【yolo11自定义实例分割训练集教程】
  • 2.2.盈亏平衡分析
  • 1块钱解锁2万部微短剧还能日更,侵权盗版难题怎么破?
  • 种植耐旱作物、启动备用水源,甘肃各地多举措应对旱情
  • 大学2025丨北大教授陈平原:当卷不过AI时,何处是归途
  • “GoFun出行”订单时隔7年扣费后续:平台将退费,双方已和解
  • 梅花奖在上海|湘剧《夫人如见》竞梅,长沙文旅来沪推广
  • 丹麦外交大臣拉斯穆森将访华