07 斐波那契数列 08 跳台阶 10 矩形覆盖 三个题的解答相似
官方正规的数学界的斐波那契数列的定义:
波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用.
是以1开头的,每次我都记混.
07 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
方法一: 用递归
比方法二好在,只用每次记录前两个值就可以了, 时间复杂度为O(n); 空间复杂度为O(1) 建议使用方法一
1 链接:https://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3 2 来源:牛客网 3 4 public class Solution { 5 public int Fibonacci(int n) { 6 int preNum=1; 7 int prePreNum=0; 8 int result=0; 9 if(n==0) 10 return 0; 11 if(n==1) 12 return 1; 13 for(int i=2;i<=n;i++){ 14 result=preNum+prePreNum; 15 prePreNum=preNum; 16 preNum=result; 17 } 18 return result; 19 20 } 21 }
方法二: 用动态规划,用数组记录F(n)的值
1 import java.util.*; 2 public class Solution { 3 public static int Fibonacci(int n) { 4 if(n<0 || n>39){ 5 System.out.println("输入有误,请重新输入"); 6 return -1; 7 } 8 if(n==0) return 0; 9 if(n==1) return 1; 10 int Fib[] = new int[n+1]; 11 Fib[0] = 0; 12 Fib[1] = 1; 13 for(int i=2;i<=n;i++){ 14 Fib[i] = Fib[i-1]+ Fib[i-2]; 15 } 16 return Fib[n]; 17 } 18 19 public static void main(String [] args){ 20 Scanner sc = new Scanner(System.in); 21 System.out.println("请输入一个整数n:"); 22 int n = sc.nextInt(); 23 int result = Fibonacci(n); 24 System.out.println("斐波那契数列的第n项为:" + result); 25 } 26 }
08 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
1 public class Solution { 2 public int JumpFloor(int target) { 3 if(target <= 0) return 0; 4 if(target == 1) return 1; 5 if(target == 2) return 2; 6 int one = 1; 7 int two = 2; 8 int result = 0; 9 for(int i = 2; i < target; i++){ 10 result = one+ two; 11 one = two; 12 two = result; 13 } 14 return result; 15 } 16 }
1 public class Solution { 2 public int JumpFloor(int n) { 3 if(n<1 ){ 4 System.out.println("输入有误,请重新输入"); 5 return -1; 6 } 7 if(n==1) return 1; 8 if(n==2) return 2; 9 int Fib[] = new int[n]; 10 Fib[0] = 1; 11 Fib[1] = 2; 12 for(int i=2;i<n;i++){ 13 Fib[i] = Fib[i-1]+ Fib[i-2]; 14 } 15 return Fib[n-1]; 16 } 17 }
10 矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

1 public class Solution { 2 public int RectCover(int n) { 3 if(n<0){ 4 System.out.println("输入有误,请重新输入"); 5 return -1; 6 } 7 if(n==0 || n==1 ||n==2) return n; 8 int a=1; 9 int b=2; 10 int sum=0; 11 for(int i=2;i<n;i++){ 12 sum = a+b; 13 a=b; 14 b=sum; 15 } 16 return sum; 17 } 18 }
注意:初始值到底是从1开始,还是从0开始,不同的题目要对斐波那契数列有不同的变形
            
 
作者:shareidea            
 
出处:https://www.cnblogs.com/shareidea94/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。   
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号