程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> LeetCode -- Climbing Stairs

LeetCode -- Climbing Stairs

編輯:C++入門知識

LeetCode -- Climbing Stairs


題目描述:


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?


就是有n階樓梯,求出不同上法的次數,每次只能上1或2階樓梯。


要求上樓梯的情況數,即求下樓梯的情況數,即對於n階樓梯的下樓情況數來說,相當於先下一階和先下兩階的情況數之和,即:
ClimbStairs(n) = ClimbStairs(n-1)+ClimbStairs(n-2)。


這個題目的遞推式完全與斐波那契數列吻合。因此可以使用斐波那契數列的快速算法來解此題從而提高效率。只是要區分只有一階樓梯的情況數為1。


有關斐波那契的快速算法,可以看筆者的這篇文章:
http://blog.csdn.net/lan_liang/article/details/40825863




本題的實現代碼:


public class Solution {
    public int ClimbStairs(int n) 
    {
    	return Go(n + 1);
    }


    private int Go(int n)
    {
    	if(n == 1 || n == 2)
    	{
    		return 1;
    	}
    	
    	if(n%2 == 0)
    	{
    		var k = n/2;
    		return Go(k) * (2*Go(k+1) - Go(k));
    	}
    	else
    	{
    		var k = (n-1)/2;
    		return Go(k+1) * Go(k+1) + Go(k) * Go(k);
    	}
    }


}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved