1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > [剑指offer][JAVA]面试题第[10-2]题[青蛙跳台阶问题][动态规划][递归]

[剑指offer][JAVA]面试题第[10-2]题[青蛙跳台阶问题][动态规划][递归]

时间:2020-06-05 18:12:04

相关推荐

[剑指offer][JAVA]面试题第[10-2]题[青蛙跳台阶问题][动态规划][递归]

【问题描述】[中等]

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为: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(n==1 ||n==0){return 1;}int a = 1;int b = 1;int c = 0;for(int i =2; i<=n;i++){c =(a +b)%1000000007;a = b ;b = c ;}return c;}

3. 递归(超时)

时间复杂度:O(2^N) 空间复杂度:O(1)

public int fib(int n) {if(n==0) return 1;if(n==1) 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[n+1]; //用于存储第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溢出”、“1e9+7是质数,对质数取模可以尽可能地让模数避免相等”以及“1e9+7是离1e9最近的质数,比较好记”

3.动态规划和记忆化递归区别

原理类似,动态规划有可能把空间复杂度降至 O(1)

参考链接:https://leetcode-/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/solution/mian-shi-ti-10-ii-qing-wa-tiao-tai-jie-wen-ti-dong/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。