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