Java-LeetCode-ClimbingStairs

今天看到ClimbingStairs这道题目,发现有多种解法,自己顺便整理了一下。主要的解题方法有三种,其中最重要的是如何将该问题和斐波那契数列进行关联起来:

1)递归实现;思路最简单,但n较大时,存储空间变大,且速度变慢。

2)迭代实现;类似方法1)。

3)采用斐波那契数列的通项公式实现。

这里主要是给出斐波那契数列的通项公式的推导过程。先给出代码,后给出推导过程,如下:

package LeetCode_chz;

import java.util.Scanner;

/**
 * @题目描述:You are climbing a stair case. It takes n steps to reach to the top.
 * Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
 * Note: Given n will be a positive integer.
 * @author 崔洪振367
 * @version 创建时间:2017年4月24日 下午4:40:39
 * 
 * 思路:这是一个爬n阶台阶的问题,每次只能攀爬1个或2个台阶。
 * f(n)=f(n-1)+f(n-2)
 */
public class Q070_ClimbingStairs {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		
		int result = climbStairs1(n);
		System.out.println(result);		
		
		int result2 = climbStairs2(n);
		System.out.println(result2);
		
		int result3 = climbStairs3(n);
		System.out.println(result3);

	}
	
	/**
	 * 递归实现
	 * @param n
	 * @return
	 */
	public static int climbStairs1(int n){
		if(n==1){
			return 1;
		}else if(n==2){
			return 2;
		}
		
		return climbStairs1(n-1) + climbStairs1(n-2);
	}
	
	/**
	 * 迭代实现
	 * 该题本质上是斐波那契数列数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
	 * 且:a1=0,a2=1,an=a(n-1)+a(n-2)(n>=2,n∈N*)即:裴波那契数列的第n项的值是第n阶楼梯的爬法的种类数
	 * 
	 * @param n
	 * @return
	 */
	public static int climbStairs2(int n){
		int a=0;//
		int b=1;
		for(int i=1; i<=n; i++){//台阶计数从1开始,一共n个
			int temp = b;//记录一下当前的值
			b += a;//更新当前的值
			a = temp;//更新前一个值			
		}
		
		return b;//返回当前的值
	}
	
	/**
	 * 采用斐波那契数列的数学公式
	 * @param n
	 * @return
	 */
	public static int climbStairs3(int n){
		double d = Math.sqrt(5.0);
		double a = (1+d)/2;
		double b = (1-d)/2;
		double aa = Math.pow(a, n+1);
		double bb = Math.pow(b, n+1);
		double c = (aa-bb)/d;
		
		return (int)c;
	}

}
推导过程如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值