LeetCode Climbing Stairs 遞迴求解和動態規劃法
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?
簡單題目,相當於fibonacci數列問題,難點就是要會思維轉換,轉換成為遞迴求解問題,多訓練就可以了。
所以這種型別的題目相對於沒有形成遞迴邏輯思維的人來說,應該算是難題。
我的想法是:
每次有兩種選擇,兩種選擇之後又是各有兩種選擇,如此迴圈,正好是遞迴求解的問題。
寫成遞迴程式其實非常簡單,三個語句就可以:
int climbStairsRecur(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return climbStairsRecur(n-1) + climbStairsRecur(n-2);
}
但是遞迴程式一般都是太慢了,因為像Fibonacci問題一樣,重複計算了很多分支,我們使用動態規劃法填表,提高效率,程式也很簡單,如下:
int climbStairs(int n) { vector<int> res(n+1); res[0] = 1; res[1] = 1; for (int i = 2; i <= n; i++) { res[i] = res[i-1] + res[i-2]; } return res[n]; }
動態規劃法用熟了,高手就需要節省空間了,如下:
int climbStairs2(int n)
{
vector<int> res(3);
res[0] = 1;
res[1] = 1;
for (int i = 2; i <= n; i++)
{
res[i%3] = res[(i-1)%3] + res[(i-2)%3];
}
return res[n%3];
}
當然,不使用上面的陣列也是可以的,直接使用三個變數儲存結果也是一樣的。
//2014-2-10 update int climbStairs(int n) { if (n < 4) return n; int a = 2, b = 3, c = 5; for (int i = 5; i <= n; i++) { a = c; c = b+c; b = a; } return c; }
相關推薦
LeetCode Climbing Stairs 遞迴求解和動態規劃法
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. I
約瑟夫環問題的兩種解決方式(遞迴求解和陣列模擬求解)
約瑟夫環問題各位Acmer肯定都遇到過,就是給你編號為從0~n-1的n個人,從頭開始報數,報到m的人離場,問最後留下的人是幾號。有兩種方法解決這個問題 第一種:陣列模擬 這種方法沒什麼好說的,就是模擬報數和離場的過程,加個訪問陣列標記一下誰離場了就好了 package H
c++使用樸素遞迴演算法(自頂向下遞迴)和動態規劃dp(帶備忘的自頂向下,自底向上)解決鋼條切割及執行例項結果
本博文資料來源於演算法導論第三版 動態規劃有兩種等價實現方法:帶備忘的自頂向下發(topDownWithMemoization),自底向上方法,付出額外的記憶體空間來節省計算時間,是典型的時空權衡,遞迴時會儲存每個子問題的解 長度n與對應價格p關係 1~10的對應最
關於遞迴做法與動態規劃做法的分析和比較
本文內容 一、主要內容 二、動態規劃原理 三、遞迴原理 四、實驗預期現象 五、Python批量生成檔案 六、遇到的困難與解決辦法 6.1測試資料執行時間 6.2批量生成檔案 七、遞迴做法相關實驗 7.1原始碼 7.1.1遞迴做法求解斐波那契數列 7.1.2測試遞迴次數 7.2實驗資料
最大子陣列問題的暴力解法,遞迴解法,動態規劃解法和暴力-遞迴混合解法
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define SIZE 5000 #define RANDOM_LIMI
輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數,使其和等於m,將其所有可能的組合列出來。 遞迴求解
/* *[email protected] 轉載請註明出處 *問題:輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數, *使其和等於m,將其所有可能的組合列出來。 *求解思路:(遞迴求解) *(1)如果n>m則數列中>m的部分不可能參與組
和為定值得多個數的遞迴求解演算法
題目如下: 輸入兩個整數 n 和 m,從數列1,2,3.......n 中 隨意取幾個數, 使其和等於 m ,要求將其中所有的可能組合列出來。 分析: 兩個數和為定值的演算法相信大家
Add Two Numbers[leetcode]遞迴版本和迴圈版本
我寫了兩個版本供參考: 遞迴版本 ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { return addTwoNumbers
[Leetcode] Climbing Stairs
problem cli ati bin not href 可用 ger 數學問題 Climbing Stairs 題解 題目來源:https://leetcode.com/problems/climbing-stairs/description/ Description
[工作準備--演算法] 八皇后問題--遞迴求解
目標 在8*8的的國際象棋中擺上八個皇后 使其不能相互攻擊 問題分析 問題的解向量:(x0,x2,x3,….,x7) 採用陣列的下標i 表示皇后的所在行 採用陣列元素x[i]表示皇后的所在列向量 約束條件
遞迴思想和例項
先給一個簡單的階乘例子: public static int getDg(int x){ System.out.println(x); if (x==1) { return 1; } if (x<4) { return x * getDg(x-1);
遞迴求解單鏈表中的最大值
1 #include<iostream> 2 using namespace std; 3 4 typedef struct LNode { 5 int data; 6 LNode *next; 7 }Lnode, *LinkList; 8 9 bool
LeetCode—77. Combinations_遞迴暴力搜尋_dfs_深度優先
題目是這樣的: 首先說明這是一個經典的遞迴窮舉搜尋問題——dfs(深度優先搜尋)題目給定N在從1...........n中存在K個數組能夠排列,就是從n中選擇k個數字進行排列。 首先老套路定義一個全域性變數來接受所得的答案,然後在函式中定義一個path(所有的路徑方案),然後就是從第一
遞迴求解走臺階問題,一次可以走一步、兩步、三步、...、n步(經典面試題——增強版走臺階)
1、問題描述 現在有一個臺階,一共有n階,你一次性可以走1步、2步、3步、......、n步。問:一共有多少種走法。 2、求解思路 第一步走1階:那麼這種情況下的走法數量和剩下n-1階的走法數量有關;
貪心演算法,遞迴演算法,動態規劃演算法比較與總結
一般實際生活中我們遇到的演算法分為四類: 一>判定性問題 二>最優化問題 三>構造性問題 四>計算性問題 而今天所要總結的演算法就是著重解決 最優化問題 《演算法之道》對三種演算法進行了歸納總結,如下表所示: 分
python3基礎(七)-遞迴函式和匿名函式
1、遞迴函式 函式內呼叫自己本身函式,就叫做遞迴函式。 計算一個數字的階乘n!=1*2*3*4*......*n 公式演變: n! = 1 * 2 * 3 * 4 * ...... * (n - 2) * (n - 1) * n = n * (n - 1) * (n - 2) *
關於二叉樹的遍歷:遞迴方式和非遞迴方式
首先來定義樹的節點: package test2018925.findTree; public class Node { public int value; public Node left; public Node right; public Node(int data){ this.va
Java:利用遞迴求解分桔子問題
問題描述: 日本著名數學遊戲專家中村義作教授提出這樣一個問題:父親將2520個桔子分給六個兒子。分完 後父親說:“老大將分給你的桔子的1/8給老二;老二拿到後連同原先的桔子分1/7給老三;老三拿到後連同原先的桔子分1/6給老四;老四拿到後連同
僅使用遞迴函式和棧操作逆序一個棧
題目 一個棧依次壓入1,2,3, 4, 5,那麼從棧頂到棧底分別為5, 4, 3, 2, 1。將這個棧轉置後,從棧頂到棧底為1,2,3, 4, 5,也就是實現棧中元素的逆序,但是隻能使用遞迴函式來實現,不能使用其他資料結構。 解題參考和一些坑 共兩個遞迴函式來實現逆序: 第一個函
Java 通過遞迴求解漢諾塔問題 原始碼 經典遞迴問題講解
漢諾塔問題描述:有三根柱子 A、B、C ,在A從下向上按照從大到小的順序放著64個圓盤,以B為中介,把盤子全部移動到C上。移動過程中,要求任意盤子的下面要麼沒有盤子,要麼只能有比它大的盤子。 分析:為了將N個盤子從A移動到C,需要先把第N個盤子上面的N-1個盤子移動到B上,這樣才能將第