LintCode 爬樓梯

題目

假設(shè)你正在爬樓梯,需要n步你才能到達(dá)頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?

樣例
比如n=3,1+1+1=1+2=2+1=3,共有3中不同的方法,返回 3

分析

典型的動(dòng)態(tài)規(guī)劃問(wèn)題。
我們假設(shè)到達(dá)第n級(jí)臺(tái)階的方法數(shù)為f(n),那么最后一步的時(shí)候,我們有兩種選擇,一是選擇爬一步,那么這時(shí)候的方法數(shù)就是f(n-1),另一種選擇是選擇爬兩步,方法數(shù)f(n-2).所以通過(guò)這個(gè)我們就可以得出f(n)的狀態(tài)轉(zhuǎn)移方程:
f(n)=f(n-1)+f(n-2)
顯然看到這里,我們可以利用遞歸求解這個(gè)問(wèn)題。

public class Solution {
    /**
     * @param n: An integer
     * @return: An integer
     */
    public int climbStairs(int n) {
        // write your code here
      if (n == 0 || n == 1) return 1;  
        if (n < 0) return 0;  
        return climbStairs(n - 1) + climbStairs(n - 2); 
    }
}
climb.PNG

提交結(jié)果告訴我們超時(shí)了。所以我們不能用遞歸,需要采用效率更高的算法。
其實(shí)這類(lèi)似于斐波那契數(shù)列,我們直接利用一個(gè)數(shù)組來(lái)記錄f(n)就可以了。

public class Solution {
    /**
     * @param n: An integer
     * @return: An integer
     */
    public int climbStairs(int n) {
        // write your code here
      if (n == 1 || n==0) return 1;
      int[] f = new int[n+1];
      f[0] = 1;
      f[1] = 1;
      for(int i=2;i<=n;i++)
         f[i] = f[i-1] + f[i-2];
      return f[n];
    }
}

這種解法可以正確通過(guò)!
但我們可以更進(jìn)一步優(yōu)化算法,只采用兩個(gè)變量即可
f(n) = f(n-1)+f(n-2)
f(n-1) = f(n) - f(n-2)
利用這個(gè)關(guān)系,
one = one + zero;
zero = one - zero;

代碼

public class Solution {
    /**
     * @param n: An integer
     * @return: An integer
     */
    public int climbStairs(int n) {
        // write your code here
      int one = 0;
      int two = 1;
      while(n>0)  {
          two=one+two;
          one=two-one;
          n--;
      }
      return two;
    }
}

小結(jié)

爬樓梯是一個(gè)典型的一維動(dòng)態(tài)規(guī)劃問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 難度:容易 要求: 假設(shè)你正在爬樓梯,需要n步你才能到達(dá)頂部...
    柒黍閱讀 469評(píng)論 0 0
  • 假設(shè)你正在爬樓梯,需要n步你才能到達(dá)頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部? 假設(shè)你正...
    DayDayUpppppp閱讀 876評(píng)論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,935評(píng)論 0 33
  • 羊駝先生丶閱讀 399評(píng)論 0 0
  • 文/小漂 今天老媽拉著我上街買(mǎi)衣服,原因不是“過(guò)新年,穿新衣”,而是實(shí)在看不下去我?guī)Щ貋?lái)的“不上檔次”的“舊衣服”...
    小太陽(yáng)漂漂漂閱讀 251評(píng)論 1 0

友情鏈接更多精彩內(nèi)容