Climbing Stairs -- LeetCode
生活随笔
收集整理的這篇文章主要介紹了
Climbing Stairs -- LeetCode
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原題鏈接:?
http://oj.leetcode.com/problems/climbing-stairs/
?
這道題目是求跑樓梯的可行解法數(shù)量。每一步可以爬一格或者兩個(gè)樓梯,可以發(fā)現(xiàn),遞推式是f(n)=f(n-1)+f(n-2),也就是等于前一格的可行數(shù)量加上前兩格的可行數(shù)量。熟悉的朋友可能發(fā)現(xiàn)了,這個(gè)遞歸式正是 斐波那契數(shù)列 的定義,不熟悉的朋友可以看看 Wiki - 斐波那契數(shù)列 。根據(jù)這個(gè)定義,其實(shí)很容易實(shí)現(xiàn),可以用遞歸或者遞推都是比較簡(jiǎn)單的,下面列舉一下遞推的代碼:? public int climbStairs(int n) {int f1 = 1;int f2 = 2;if(n==1)return f1;if(n==2)return f2;for(int i=3;i<=n;i++){int f3 = f1+f2;f1 = f2;f2 = f3;}return f2; }
所以如果我們用 Pow(x, n)中介紹的分治法來求解這個(gè)n次冪的話可以完成O(logn)的求解。還有另一種理解方法就是斐波那契數(shù)列的線性代數(shù)解法(參見 Wiki - 斐波那契數(shù)列),可以看到迭代是一個(gè)二乘二的簡(jiǎn)單矩陣,數(shù)列的第n個(gè)數(shù)就是求解這個(gè)矩陣的n-2次冪,同樣用分治法就可以完成O(logn)的求解。 這是對(duì)于斐波那契數(shù)列問題的一般面試過程,先實(shí)現(xiàn)一下通常的O(n)的解法,然后再了解一下是否知道有O(logn)的解法,一般不要求實(shí)現(xiàn),知道就行,不過其實(shí)實(shí)現(xiàn)也不是很難,有興趣的朋友可以練習(xí)一下哈。
這道題目是求跑樓梯的可行解法數(shù)量。每一步可以爬一格或者兩個(gè)樓梯,可以發(fā)現(xiàn),遞推式是f(n)=f(n-1)+f(n-2),也就是等于前一格的可行數(shù)量加上前兩格的可行數(shù)量。熟悉的朋友可能發(fā)現(xiàn)了,這個(gè)遞歸式正是 斐波那契數(shù)列 的定義,不熟悉的朋友可以看看 Wiki - 斐波那契數(shù)列 。根據(jù)這個(gè)定義,其實(shí)很容易實(shí)現(xiàn),可以用遞歸或者遞推都是比較簡(jiǎn)單的,下面列舉一下遞推的代碼:? public int climbStairs(int n) {int f1 = 1;int f2 = 2;if(n==1)return f1;if(n==2)return f2;for(int i=3;i<=n;i++){int f3 = f1+f2;f1 = f2;f2 = f3;}return f2; }
可以很容易判斷,上面代碼的時(shí)間復(fù)雜度是O(n),面試一般都會(huì)實(shí)現(xiàn)一下,不過還沒完,面試官會(huì)接著問一下,有沒有更好的解法?還真有,斐波那契數(shù)列其實(shí)是有O(logn)的解法的。根據(jù)wiki我們知道,斐波那契數(shù)列是有通項(xiàng)公式的,如下:
所以如果我們用 Pow(x, n)中介紹的分治法來求解這個(gè)n次冪的話可以完成O(logn)的求解。還有另一種理解方法就是斐波那契數(shù)列的線性代數(shù)解法(參見 Wiki - 斐波那契數(shù)列),可以看到迭代是一個(gè)二乘二的簡(jiǎn)單矩陣,數(shù)列的第n個(gè)數(shù)就是求解這個(gè)矩陣的n-2次冪,同樣用分治法就可以完成O(logn)的求解。 這是對(duì)于斐波那契數(shù)列問題的一般面試過程,先實(shí)現(xiàn)一下通常的O(n)的解法,然后再了解一下是否知道有O(logn)的解法,一般不要求實(shí)現(xiàn),知道就行,不過其實(shí)實(shí)現(xiàn)也不是很難,有興趣的朋友可以練習(xí)一下哈。
總結(jié)
以上是生活随笔為你收集整理的Climbing Stairs -- LeetCode的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】如何根据图片的网络url,下
- 下一篇: 当月日历打印