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

相关推荐
小王不爱笑13227 分钟前
IO 模型
开发语言·python
知我Deja_Vu1 小时前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
AI+程序员在路上1 小时前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
2401_831824961 小时前
基于C++的区块链实现
开发语言·c++·算法
We་ct1 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
愣头不青1 小时前
238.除了自身以外数组的乘积
数据结构·算法
爱编码的小八嘎1 小时前
C语言完美演绎4-4
c语言
人工智能AI酱2 小时前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
WangLanguager2 小时前
逻辑回归(Logistic Regression)的详细介绍及Python代码示例
python·算法·逻辑回归
m0_518019482 小时前
C++与机器学习框架
开发语言·c++·算法