PROBLEM 剑指 Offer 10- II. 青蛙跳台阶问题
难度 简单
MY ANSWER 与求斐波那契数相同,f(n) = f(n - 1) + f(n - 2),只不过f(0) = 1, f(1) = 1。时间复杂度O(n),空间复杂度O(1)。
class Solution {public : int numWays (int n) { int a = 1 , b = 1 , c = 0 ; for (int i = 0 ; i < n; i++) { c = (a + b) % 1000000007 ; a = b; b = c; } return a; } };
BETTER SOLUTION 矩阵快速幂 同样适用于求斐波那契数。时间复杂度O(logn),O(1)。
使用快速幂计算M的n次幂就可以得到结果。
class Solution {public : vector<vector<long long >> multiply (vector<vector<long long >> &a, vector<vector<long long >> &b) { vector<vector<long long >> c (2 , vector<long long >(2 )); for (int i = 0 ; i < 2 ; i++) { for (int j = 0 ; j < 2 ; j++) { c[i][j] = a[i][0 ] * b[0 ][j] + a[i][1 ] * b[1 ][j]; } } return c; } vector<vector<long long >> matrixPow (vector<vector<long long >> a, int n) { vector<vector<long long >> ret = {{1 , 0 }, {0 , 1 }}; while (n > 0 ) { if ((n & 1 ) == 1 ) { ret = multiply (ret, a); } n >>= 1 ; a = multiply (a, a); } return ret; } int climbStairs (int n) { vector<vector<long long >> ret = {{1 , 1 }, {1 , 0 }}; vector<vector<long long >> res = matrixPow (ret, n); return res[0 ][0 ]; } };
SUMMARY 掌握矩阵快速幂法。