剑指 Offer | 面试题 10:青蛙跳台阶题
死磕算法系列文章
- 干货 | 手撕十大经典排序算法
- 剑指offer | 认识面试
- 剑指offer | 面试题2:实现Singleton模式
- 剑指offer | 面试题3:二维数组的查找
- 剑指offer | 面试题4:替换空格
- 剑指offer | 面试题5:从尾到头打印链表
- 剑指offer | 面试题6:重建二叉树
- 剑指offer | 面试题7:用两个栈实现队列
- 剑指offer | 面试题8:旋转数组的最小数字
- 剑指offer | 面试题9:斐波那契数列
“Leetcode : https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof
“GitHub : https://gitee.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_10_numWays/Solution.java
面试题10: 青蛙跳台阶问题
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
示例 3:
输入:n = 0
输出:1
提示:0 <= n <= 100
解题思路:
“此类求 多少种可能性 的题目一般都有 递推性质 ,即 f(n)和 f(n-1)…f(1) 之间是有联系的。
- 当为 1 级台阶:剩 n-1 个台阶,此情况共有 f(n-1)种跳法;
- 当为 2 级台阶:剩 n-2 个台阶,此情况共有 f(n-2) 种跳法。
f(n) 为以上两种情况之和,即 f(n)=f(n-1)+f(n-2),以上递推性质为斐波那契数列。本题可转化为 求斐波那契数列第 n 项的值 ,与 面试题 斐波那契数列 等价,唯一的不同在于起始数字不同。
- 青蛙跳台阶问题:f(0)=1 , f(1)=1 , f(2)=2;
- 斐波那契数列问题:f(0)=0 , f(1)=1 , f(2)=1;
复杂度分析:
- 时间复杂度 O(N): 计算 f(n) 需循环 n 次,每轮循环内计算操作使用 O(1) 。
- 空间复杂度 O(1) : 几个标志变量使用常数大小的额外空间。
代码实现
package com.nateshao.sword_offer.topic_10_numWays;
/**
* @date Created by 邵桐杰 on 2021/11/19 23:34
* @微信公众号 程序员千羽
* @个人网站 www.nateshao.cn
* @博客 https://nateshao.gitee.io
* @GitHub https://github.com/nateshao
* @Gitee https://gitee.com/nateshao
* Description: 青蛙跳台阶问题
*/
public class Solution {
public static void main(String[] args) {
int i = numWays(7);
System.out.println("i = " + i);
int i1 = JumpFloor(7);
System.out.println("i1 = " + i1);
}
public static int numWays(int n) {
int a = 1, b = 1, sum;
for (int i = 0; i < n; i++) {
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return a;
}
/**
* 思路:斐波那契数列思想
*
* @param n
* @return
*/
public static int JumpFloor(int n) {
if (n < 3) {
return n;
}
int result = 0;
int preOne = 2;
int preTwo = 1;
for (int i = 3; i <= n; i++) {
result = preOne + preTwo;
preTwo = preOne;
preOne = result;
}
return result;
}
}
青蛙跳台阶(n 级)
“题目描述:一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级……它也可以跳上 n 级。 求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
思路:2^(n-1)
代码实现:
public int JumpFloor2(int target) {
return (int) Math.pow(2,target-1);
}
革命尚未成功,同志仍需努力,冲冲冲
上一篇: Sword to Offer | 面试问题 8:斐波纳契数列
下一篇: 《阿拉沟之美》
推荐阅读
-
C语言的10种基本算法,学习C语言必须要有源代码(珍藏版)
-
LeetCode 面试经典 150 题 28.找出字符串中第一个匹配项的下标
-
C 编程语言基础入门经典 100 题(1-10) - Simple_c 简单代码
-
Windows 10 + kali Linux 双系统安装教程(详细版)
-
MyBatis 学习总结 (10) - 批量操作
-
10万条评论告诉你,那些给Wanderlust打1星的人是什么心态?| 阿尔弗雷德资料室
-
腾讯10部2024年1月即将上线的剧,好剧来袭,你最期待哪一部?
-
Galaxy KyLin Desktop V10 - 通过命令行关闭屏幕保护程序、休眠和显示器
-
Win10LTSC2021 企业版新版激辩密钥共享
-
Wsw 课后题