公司网站本地如何弄,石家庄楼盘最新消息,加速wordpress,唐山哪里建设网站好【问题描述】[中等]
一只青蛙一次可以跳上1级台阶#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e97#xff08;1000000007#xff09;#xff0c;如计算初始结果为#xff1a;1000000008#xff0c;请返回 1。【解答思路…【问题描述】[中等]
一只青蛙一次可以跳上1级台阶也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e971000000007如计算初始结果为1000000008请返回 1。
【解答思路】 1. 动态规划 时间复杂度O(N) 空间复杂度O(1)
class Solution {public int fib(int n) {if(n 0) return 1;int[] dp new int[n 1];dp[0] 1;dp[1] 1;for(int i 2; i n; i){dp[i] dp[i-1] dp[i-2];dp[i] % 1000000007;}return dp[n];}
}2. 动态规划空间复杂度优化
dp[n 1] - abc 时间复杂度O(N) 空间复杂度O(1) public int numWays(int n) {if(n1 ||n0){return 1;}int a 1;int b 1;int c 0;for(int i 2; in;i){c (a b)%1000000007;a b ;b c ;}return c;}
3. 递归超时 时间复杂度O(2^N) 空间复杂度O(1) public int fib(int n) {if(n0) return 1;if(n1) return 1;return (numWays(n-1)numWays(n-2))%1000000007;}}4. 记忆化递归 时间复杂度O(N) 空间复杂度O(1)
public int numWays(int n) {if(n 0) return 1;int[] memorization new int[n1]; //用于存储第0~n个数对应的值memorization[0] 1; memorization[1] 1; //第一二个数先定义好由于第一个数是0默认即可不用写出return Fibonacci(n,memorization);}public int Fibonacci(int n,int[] memo) {if(n 2 ) //当n等于0或1时将不再往下递归直接返回记忆化结果对应的值return memo[n];if(memo[n] 0) //当遇到之前计算过的数时将不再递归往下找直接用记忆化结果return memo[n];memo[n] (Fibonacci(n - 2, memo) Fibonacci(n - 1, memo)) % 1000000007;return memo[n];}【总结】
1.提高问题转化能力本质上是斐波那契数列只是初始化条件略微不同
2.取余原因
“int32类型是十位数对1e9取模可防止int32溢出”、“1e97是质数对质数取模可以尽可能地让模数避免相等”以及“1e97是离1e9最近的质数比较好记”
3.动态规划和记忆化递归区别
原理类似动态规划有可能把空间复杂度降至 O(1)
参考链接https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/solution/mian-shi-ti-10-ii-qing-wa-tiao-tai-jie-wen-ti-dong/