LeetCode 70. 爬楼梯
📆Date: 2023年3月13日
✒️Author: SmartBoy
📓Classify:LeetCode
🔖Language: Java
✨题目描述:
假设你正在爬楼梯。需要
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
🎉解题思路:
运用递归的方法或循环的方法
递归
如果只有一个台阶,那么就只有1种方法爬到楼顶,即n == 1时;
如果有两个台阶,那么就会有:
- 一阶一阶上;
- 直接上两阶。
两种方法。
那么,其实可以将上台阶简化为:第一步上一阶台阶后剩下的n-1个楼梯走法的个数与第一步上两个台阶后剩下的n-2个楼梯走法的个数之和,即当n > 3时,f(n) = f(n - 1) + f(n - 2)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtoqcHR5-1678708754397)(D:\JavaCode\StudyNotes\LeetCode\src\LeetCodePro\Problem1\爬楼梯.assets\image-20230313194840126.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S0I3soyC-1678708754398)(D:\JavaCode\StudyNotes\LeetCode\src\LeetCodePro\Problem1\爬楼梯.assets\image-20230313194857162-16787081383981.png)]
利用HashMap对已经求得的f(k)进行保存,降低复杂度,当再次碰到f(k)时,先在HashMap中查找,从而避免复杂计算。时间复杂度为O(n)。
循环方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gWwPsHDU-1678708754398)(D:\JavaCode\StudyNotes\LeetCode\src\LeetCodePro\Problem1\爬楼梯.assets\image-20230313194910295.png)]
自底向上累加。
🥇Java源码:
package LeetCodePro.Problem1; import java.util.Scanner; /** * @Auther:Xust_SmartBoy * @Date:2023/3/13 19:11 * @Description:LeetCode * @User:SmartBoy * @VERSON:爬楼梯 递归算法 * 假设你正在爬楼梯。需要 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 阶 */ public class Problem1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("输入台阶总数n:"); int n = sc.nextInt(); Solution1 solution1 = new Solution1(); Solution2 solution2 = new Solution2(); Solution3 solution3 = new Solution3(); // System.out.println("总共的方法数为:" + solution1.climbStairs(n)); // System.out.println("总共的方法数为:" + solution2.climbStairs(n)); System.out.println("总共的方法数为:" + solution3.climbStairs(n)); } }
package LeetCodePro.Problem1; /** * @Auther:Xust_SmartBoy * @Date:2023/3/13 19:17 * @Description:LeetCodePro.Problem1 * @User:SmartBoy * @VERSON: 超出时间限制 */ public class Solution1 { int climbStairs(int n) { if (n == 1) return 1; if (n == 2) return 2; return climbStairs(n-1) + climbStairs(n - 2); } }
package LeetCodePro.Problem1; import java.util.HashMap; import java.util.Map; /** * @Auther:Xust_SmartBoy * @Date:2023/3/13 19:33 * @Description:LeetCodePro.Problem1 * @User:SmartBoy * @VERSON:递归,自顶向下 */ public class Solution2 { private Map<Integer,Integer> map = new HashMap<>(); int climbStairs(int n) { if (n == 1){ return 1; } if (n == 2){ return 2; } if (map.get(n) != null){ return map.get(n); } else { int result = climbStairs(n-1) + climbStairs(n -2); map.put(n,result); return result; } } }
package LeetCodePro.Problem1; /** * @Auther:Xust_SmartBoy * @Date:2023/3/13 19:38 * @Description:LeetCodePro.Problem1 * @User:SmartBoy * @VERSON:循环解法,自底向上累加 */ public class Solution3 { int climbStairs(int n) { if (n == 1) return 1; if (n == 2) return 2; int result = 0; int pre = 2; int prePre = 1; for (int i = 3; i <= n; i++) { result = pre + prePre; prePre = pre; pre = result; } return result; } }