剑指Offer #09 变态跳台阶(数列推导)

题目来源:牛客网-剑指Offer专题
题目地址:变态跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

题目解析

这道题有两种比较可靠的方法可以得到规律:

第一种就是观察法,我们先枚举出自己有耐心算得出来的部分,一般是如下表所示:

n n 1 2 3 4 5
r e s u l t result 1 2 4 8 16

基于我们强大的数学基础(良好的运气 )和细致的观察能力(搏一搏的心态 ),我们可以发现规律就是 2 n 1 2^{n-1}

第二种是数学推导法,咋们当然还是信奉科学(玄学 )的方法。

设该青蛙跳上一个 i i 级的台阶总共有 f ( i ) f(i) 种跳法,则由题意可得

f ( 1 ) = 1 f(1) = 1
f ( 2 ) = f ( 2 1 ) + 1 f(2)=f(2-1)+1
f ( 3 ) = f ( 3 2 ) + f ( 3 1 ) + 1 f(3)=f(3-2)+f(3-1)+1
f ( 4 ) = f ( 4 3 ) + f ( 4 2 ) + f ( 4 1 ) + 1 f(4)=f(4-3)+f(4-2)+f(4-1)+1
. . . . . . ......
f ( n 1 ) = f ( 1 ) + f ( 2 ) + . . . + f ( n 2 ) + 1 f(n-1)=f(1)+f(2)+...+f(n-2)+1
f ( n ) = f ( 1 ) + f ( 2 ) + . . . + f ( n 2 ) + f ( n 1 ) + 1 f(n)=f(1)+f(2)+...+f(n-2)+f(n-1)+1

由后面 f ( n ) f ( n 1 ) f(n)-f(n-1) 得,

f ( n ) = 2 f ( n 1 )       f ( n ) f ( n 1 ) = 2 f(n)=2*f(n-1) \implies \frac{f(n)}{f(n-1)}=2
f ( n ) \therefore f(n) 是首项为 f ( 0 ) f(0) ,公比为 2 2 的等比数列,即 f ( n ) = 2 n 1 f(n)=2^{n-1}

公式都有了,解决起来就简单了,这里给大家提供三种实现方式。

方法一:
直接上快速幂的模板, O ( l o g n ) O(logn) 的时间复杂度解决问题,妥妥的。

public class Solution {
    private int quickPow(int a, int n) {
        int ans = 1;
        while (n != 0) {
            if (n % 2 == 1) {
                ans *= a;
            }
            a *= a;
            n /= 2;
        }
        return ans;
    }
    public int JumpFloorII(int target) {
        return quickPow(2, target - 1);
    }
}

想学快速幂的小伙伴可以看这篇博客:数论基础之快速幂(详细教程)

方法二:
调用Math类中的求幂方法pow,再进行强制类型装换,同样可以得到正确的结果。

public class Solution {
    public int JumpFloorII(int target) {
        return (int)Math.pow(2, target - 1);
    }
}

方法三:
利用位运算实现,不熟位运算的小伙伴可以看这篇博客:C++描述的位运算总结

public class Solution {
    public int JumpFloorII(int target) {
        return 1 << (target - 1);
    }
}
发布了78 篇原创文章 · 获赞 157 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42292229/article/details/104537227