九章演算法 Bloomberg面試題 不同的路徑

2021-10-13 21:04:24 字數 2377 閱讀 9709

有乙個機械人的位於乙個 m × n 個網格左上角。

機械人每一時刻只能向下或者向右移動一步。機械人試圖達到網格的右下角。

問有多少條不同的路徑?

注意:n和m均不超過100,且答案保證在32位整數可表示範圍內。

lintcode 領扣

樣例1:

input: n = 1, m = 3

output: 1

explanation: only one path to target position.

樣例2:

input:  n = 3, m = 3

output: 6

explanation:

d : down

r : right

1) ddrr

2) drdr

3) drrd

4) rrdd

5) rdrd

6) rddr

挑戰要求時間複雜度為 o(n)

根據組合公式,有

計算三數的階乘,我們就能得出答案。我們還可以進行一定的優化,展開成上述公式的最右項。設m < n,那麼時間複雜度就只有o(m)。

class

solution

:"""

@param m: positive integer (1 <= m <= 100)

@param n: positive integer (1 <= n <= 100)

@return: an integer

"""def

uniquepaths

(self,m

,n):#

corner

caseif(

m==1or

n==1):

return1#

保證m<=nif

(m>n):

m,n=

n,m#

計算階乘

temp=1

res=

1foriin

range(1

,m):temp*=i

fori

inrange(n

,m+n

-1):res*=i

return

res//

temp

class

solution

:"""

@param m: positive integer (1 <= m <= 100)

@param n: positive integer (1 <= n <= 100)

@return: an integer

"""def

uniquepaths

(self,m

,n):dp=[[

0]*n

for_

inrange(m

)]foriin

range(m

):forjin

range(n

):ifi==

0orj==

0:dp[

i][j]

=1else:dp

[i][j

]=dp[

i-1][

j]+dp

[i][j

-1]returndp[

m-1][

n-1]

dp可以優化為一維滾動陣列。當第i次遍歷到dp[j]時,dp[j]表示到達(i, j)最多的路徑數。遞推公式為:dp[j]+=dp[j−1]。

class

solution

:"""

@param m: positive integer (1 <= m <= 100)

@param n: positive integer (1 <= n <= 100)

@return: an integer

"""def

uniquepaths

(self,m

,n):dp=[

0]*n

dp[0]

=1fori

inrange(m

):forjin

range(1

,n):dp[j

]+=dp[

j-1]

returndp[

n-1]

更多題解參考:九章演算法-官方題解

九章演算法 Google面試題 內積

描述 給定長度為n的a陣列,長度為k的b陣列 你可以從a陣列裡取k個數 規則如下 即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除 將取出的ai按取出的順序組成c陣列 求b與c的內積最大值 b與c內積為 i 0k 1bi ci 解釋1 a 1,4,3,2,5 b 1,2,3,4 ...

動態規劃 九章演算法

最近看了九章演算法的動態規劃班,受益匪淺,一點簡要的筆記分享給大家 什麼是動態規劃?簡而言之,就是計算並儲存小問題的解,並將這些解組合成大問題的解。動態規劃題目的特點 1 計數 1 有多少種方式走到右下角 2 有多少種方法選出k個數使得和為sum 2 求最大值最小值 1 從左上角到右下角路徑的最大數...

九章演算法面試題32 小球排序

有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第乙個紅色停下,交換兩根指標所指顏色。重複上述過程。直到第二根指標找不到任何紅色。此時第一根指標到最後都是黃色或藍...