Leetcode记录-面试题 08.01. 三步问题
1. 面试题 08.01. 三步问题
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
- 示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
1.1. 问题分析
1.1.1. 深度遍历
数组[1,2,3]求排列,当n=4时,有[[1,1,1],[1,2],[2,1],[3]]四种,即循环搜索[1,2,3]集合,当取出的元素总和等于n时,递归结束。再通过一个hash表去重,最后hash表的长度即解的数量
1.1.1.1. 代码实现
private void dfs(int[] arr, int n, Stack<Integer> path, Map<String, Integer> maps) {
for (int m : arr) {
path.add(m);
int tmp = sum(path);
if (tmp == n) {
maps.put(toString2(path), 1);
} else if (tmp > n) {
path.pop();
break;
} else if (tmp < n) {
dfs(arr, n, path, maps);
}
path.pop();
}
}
- 空间复杂度,hash表是额外的空间,
- 时间复杂度,递归1次进行3次遍历,O(2^n)
1.1.2. 数学解法-找规律
该问题属于爬台阶的变种,走到第i级台阶时,有三种办法可以走到。从i-1级走1级到达;从i-2级台阶走2级到达;从i-3级走3级到达。故有:f(i)=f(i-1)+f(i-2)+f(i-3);
1.1.2.1. 实现
if (n == 1) {
return 1;
} else if (n == 2) {
return 2;
} else if (n == 3) {
return 4;
} else {
long[] dp = new long[n + 1];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= n; i++) {
dp[i] = (dp[i - 1] +dp[i - 2] + dp[i - 3])%1000000007;
System.out.println(i+" "+dp[i]);
}
return (int)dp[n];
}
- 空间复杂度,O(n)
- 时间复杂度,一次遍历O(n)
1.2. 输出样例:
n | output |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 7 |
20 | 121415 |
30 | 53798080 |
61 | 752119970 |
分类:
JAVA
, 算法/algorithm
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体