台階很高,青蛙跳不跳?

2022-01-10 16:02:37 字數 2021 閱讀 8313

青蛙總是被被要求跳台階,我想,他一定很累的!

乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個 n 級的台階總共有多少種跳法?

對於這樣的問題,n可大可小,如果n很小,我們可以直觀暴力拆解就可以得到答案,但是如果n很大,那麼這個問題就公升級了。

一般處理問題,我們最直接的思路,可能就是分治,將大問題拆解為小問題,分而解決。

在此,也不例外。

首先我們知道青蛙一次能跳一級或者兩級。

假定最後一跳跳一級,則剩餘n-1個台階,則問題化為解決跳上n-1個台階的問題。

假定最後一跳跳兩級,則剩餘n-2個台階,則問題化為解決跳上n-2個台階的問題。

所以歸總起來,總的可能的跳法為(n-1)個台階和(n-2)個台階問題的總和。

我們假定解決方案為f(n),則f(n) = f(n-1) + f(n-2) ,這裡我們假定n是大於2的。

當n = 1 時,青蛙跳一級即可,f(1) = 1。

當n = 2 時,青蛙可以連跳兩個一級或者跳乙個兩級,f(2) = 2。

觀察f(n) = f(n-1) + f(n-2) 公式,你們首先想到的是什麼?對的,是遞迴,級聯求解:

public

static

long jump(int

n)

return jump(n - 1) + jump(n - 2);

}

我們以影象化展示一下這個過程:

圖中以相同顏色標識了遞迴過程中會產生重複計算的節點。

重複是一種算力和資源不必要的浪費,我們可以對此進行優化:

對於上述的遞迴運算,我們可以看到,是由後至前計算的,也即從f(n)->f(1)。也就是我們需要知道向前的每乙個位置的方案結果。我們換個方向,從前至後連續計算出每個位置的方案,則最後的位置即為我們所要的結果,同時也可以規避重複計算的問題:

**實現:

public

static

long jumpx(int

n)

//每個位置儲存下標(i + 1)個台階的可能結果f(i + 1),所以n個台階即為計算f(n - 1)

long arr = new

long[n];

arr[0] = 1l; //

乙個台階

arr[1] = 2l; //

兩個台階

//從 n = 3 開始迴圈計算

for (int i = 2; i < n; i++)

return arr[n - 1];

}

我們通過增加乙個長度為n的陣列空間占用來換取演算法耗時優化,相對於遞迴演算法,耗時上有數量級差別。

耗時減少了,但是空間似乎浪費了,其實,也沒必要儲存每乙個方案的結果,我們只需要知道【前乙個】,【前兩個】以及【當前】的幾個變數。

改造如下:

public

static

long jumpy(int

n)

//第三節台階方案值f(3) = f(2) + f(1) = 1 + 2 = 3;

long pretwocount = 1; //

乙個台階

long preonecount = 2; //

兩個台階

long stepscount = 0; //

n個台階

//從 n = 3 開始迴圈計算

for (int i = 2; i < n; i++)

return

stepscount;

}

空間複雜度降為o(1)。

青蛙跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。解題思路 1 如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 2 假定第一次跳的是2階,那麼剩下的是n 2個台階,跳法是f n 2 3 總跳法為 f n f n...

青蛙跳台階

之前面試遇到了這種題目,不會,後來搜尋了一下,感覺分析的很好 青蛙跳乙個n階的台階,每次可以跳1階或者2階,求跳完n階y有多少種方法。分析 n 1,f n 1 n 2,f n 2 n 3,f n 3 n 4,f n 5 可以發現 f n f n 1 f n 2 由此也可以推想 比如要跳到第4階樓梯上...

青蛙跳台階

難易程度 中等 題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。在不考慮青蛙健康狀況的情況下 求該青蛙跳上乙個n級的台階總共有多少種跳法。思路 在本題的描述中,青蛙的行動只有兩種可能 一次跳乙個台階或者兩個台階,設n階台階的跳法為 f n 如果第一次跳了一階,那麼剩下的n 1階的跳法為f n...