1.單詞搜索
class Solution:
"""
leetcode79 二維網格單詞搜索
"""
def isExit(self,board,word,x,y,idx,roads):
"""
遞歸過程
:param board:
:param word:
:param idx:
:param roads:
:return:
"""
if idx==len(word):
#所有的字母都查詢完了
return True
if x>=0 and x<len(board) and y>=0 and y<len(board[0]) and ([x,y] not in roads):
if board[x][y]==word[idx]:
#這個位置上可以查詢到第一個字母
roads.append([x,y])
#接下來查詢下一個字母,位置範圍是(x-1,y)...
idx+=1
if self.isExit(board,word,x-1,y,idx,roads):
return True
if self.isExit(board,word,x+1,y,idx,roads):
return True
if self.isExit(board,word,x,y-1,idx,roads):
return True
if self.isExit(board,word,x,y+1,idx,roads):
return True
#上面這些位置都查詢不到的話,退一步
roads.pop()
idx-=1
return False
def exist(self,board,word):
"""
:param board:
:param word:
:return:
"""
roads=[]
for i in range(len(board)):
for j in range(len(board[0])):
if self.isExit(board,word,i,j,0,roads):
return True
else:
return False
分析:回溯算法與遞歸
回溯過程:當前點(x,y),搜索(x-1,y),(x+1,y),(x.y-1),(x,y+1)四個位置,這些位置需要滿足1. 不過界 ,2. 不在已經搜索過的路徑上。從先判斷(x,y)位置是不是第一個字母,若是,則搜索它周圍的點,這個過程就是一個遞歸的過程,
遞歸過程:遞歸的過程及重複調用自身函數的過程。
函數體:本題中需要重複的是,(x,y)位置與當前字母匹配嗎,位置符合要求,查詢下一個位置(即遞歸),遞歸出口:單詞每個字母都查詢完成或沒有符合的可選位置了。
2. 不同路徑(62)
class UniquePaths:
def uniquePaths(self, m: int, n: int) -> int:
"""
:param m: m>=1
:param n: n>=1
:return:
"""
if m<1 or n<1:
return False
x0,y0=0,0
x1,y1=m-1,n-1
steps=x1-x0+y1-y0
shang=1
for i in range(n-1):
shang=shang*(steps-i)
xia=self.factorial(y1)
return int(shang/xia)
def factorial(self,x):
"""
求x的階乘
:param x: >=0
:return:
"""
if x == 0 or x == 1:
return 1
else:
return (x * self.factorial(x - 1))
分析:從題目可以分析,73大小的格子,起點(0,0),終點(6,2),一共要走6-0+2-0=8步,到達終點,這八步中,需要向下走2步,即從8步中,選擇兩2向下走,C8,2=(87)/(2*1)=28