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