乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為 「start」 )。
機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為 「finish」 )。
問總共有多少條不同的路徑?
輸入:m = 3, n = 7
輸出:28
本題有個很重要的地方,就是規定了移動的方向只能向右或向下,換種思路去理解,
對於乙個方塊,到達它只能從它的上方或者左方
也就是說,到達某個方塊的路徑的數量為到達它上方和左方方塊的路線數量之和。
有了這一點,可以去想到通過不斷計算從左上到右下的每個方塊的路線數量,進而最終得到右下角方塊的路線數。
但這邊要注意初始化不能進行左+上操作的網格的值
定義乙個矩陣,大小和題中的網格相同,將最上方的一行和最左側的一列的值初始化為 1 ,其餘節點值為0
對為0的節點進行逐行計算,直至最後得出目標值helper=[[
1]*n]+[[
1]+[
0]*(n-1)
for _ in
range
(m-1
)]
假設需要爬 n 節樓梯,每次爬 1 或 2 節,請問有多少種爬樓方案?#從helper[1][1]開始
for i in
range(1
,m):
for j in
range(1
,n):
helper[i]
[j]=helper[i-1]
[j]+helper[i]
[j-1
]return helper[m-1]
[n-1
]
看到本題,第一反應就是遞迴,因為每一次有兩種選擇,所以走 n 個台階只能選擇 1 + n-1 和 2 + n-2 兩種方案,即n個台階的總方案數f(n)=f(n-1)+f(n-2), 瞬間很熟悉,對,很像斐波那契數列。
所以馬上寫了個遞迴提交了:
然後就超時了……,因為這樣出現了大量的重複計算,取個較大的n的話可能就算了不知道多少遍的f(2)、f(3),所以還是用乙個迴圈進行計算比較合適。def
climbstairs
(self, n:
int)
->
int:
if n==1:
return
1elif n==2:
return
2else
:return self.climbstairs(n-1)
+self.climbstairs(n-
2)
給你乙個整數陣列if n<3:
return n
a,b,c=1,
2,0for i in
range(3
,n+1):
c=a+b
a,b=b,c
return c
nums
,返回該陣列所有可能的子集(冪集)。解集不能包含重複的子集。
eg
輸入:nums = [1,2,3]
輸出:[,[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
這題可以用遞迴,也可以用迭代,其實思路是一樣的
以集合[1,2,3]為例,對於每個數,比如1, 它取不取就是兩種情況,空集 和集合 [1],如上圖所示
對於當前數:
具體實現如下:
迭代的方式**更簡潔一點,其實思路和上方一樣,就不多說了。def
subsets
(self, nums: list[
int])-
> list[list[
int]]:
cur=
iflen
(nums)==1
:return[[
],[nums[0]
]]for item in self.subsets(nums[1:
]):[
]+item)
[nums[0]
]+item)
return cur
res=[[
]]for i in nums:
res=res+
[[i]
+num for num in res]
return res
DAY8學習筆記
檔案操作的基本概念 開啟檔案的模式有三種純淨模式 r 預設的 w a。控制操作檔案內容格式的兩種模式 t 預設的 b。大前提 tb模式均不能單獨使用,必須與純淨模式結合使用。t文字模式 1.讀寫檔案都是以字串為單位的。2.只能針對文字檔案。3.必須指定encoding引數。b二進位制模式 1.讀寫檔...
java學習筆記day8
多型 定義 某一類事物的多種存在形式。例 動物中貓,狗。貓這個物件對應的型別是貓型別。貓 x new 貓 同時貓也是動物中的一種,也可以把貓稱為動物。動物 y new 貓 動物是貓和狗具體事物中抽取出來的父型別。父型別引用指向了子類物件。多型 可以理解為事物存在的多種體現形態。人 男人,女人。動物 ...
python學習筆記 day8
if 條件 語句if 條件 語句else 語句if 條件 語句elif 條件 語句else 語句python中使用elif代替else if,所以if語句的關鍵字是if elif else 需要注意的是 語句的縮排 python中沒有switch case語句 如果語句只有一條,可以寫在 if 後 ...