前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer | 面试题10:青蛙跳台阶问题

剑指offer | 面试题10:青蛙跳台阶问题

作者头像
千羽
发布2021-12-29 13:10:05
4130
发布2021-12-29 13:10:05
举报
文章被收录于专栏:程序员千羽

死磕算法系列文章

  1. 干货 | 手撕十大经典排序算法
  2. 剑指offer | 认识面试
  3. 剑指offer | 面试题2:实现Singleton模式
  4. 剑指offer | 面试题3:二维数组的查找
  5. 剑指offer | 面试题4:替换空格
  6. 剑指offer | 面试题5:从尾到头打印链表
  7. 剑指offer | 面试题6:重建二叉树
  8. 剑指offer | 面试题7:用两个栈实现队列
  9. 剑指offer | 面试题8:旋转数组的最小数字
  10. 剑指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:

代码语言:javascript
复制
输入:n = 2
输出:2

示例 2:

代码语言:javascript
复制
输入:n = 7
输出:21

示例 3:

代码语言:javascript
复制
输入: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) : 几个标志变量使用常数大小的额外空间。

代码实现

代码语言:javascript
复制
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)

代码实现:

代码语言:javascript
复制
public int JumpFloor2(int target) {
 return (int) Math.pow(2,target-1);
}

革命尚未成功,同志仍需努力,冲冲冲

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 千羽的编程时光 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面试题10: 青蛙跳台阶问题
    • 解题思路:
    • 青蛙跳台阶(n 级)
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档