题一:79. 单词搜索
链接
关键点
- 其实随想录有很多类似的,本题只是基础题,所以这一块需要加强
- 整体思路:先写主循环,判断首个字母相等才进入递归;回溯体现在某轮递归对已走过的元素的标记,且结束之后取消标记
编程思路
Me:
- 无
力扣实战
思路一:
class Solution:
# 定义上下左右四个行走方向
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
m = len(board)
n = len(board[0])
mark = [[0]*n for _ in range(m)]
directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
def backtrack(i, j, mark, board, word):
if len(word) == 0: #长度为零说明word的最后一个元素也已经被考虑了
return True
for direct in directs: #方向移动
cur_i = i + direct[0]
cur_j = j + direct[1]
if cur_i >= 0 and cur_i < len(board) and cur_j >= 0 and cur_j < len(board[0]) and board[cur_i][cur_j] == word[0]: #处理越界,若越界,则此方向取消
# 如果是已经使用过的元素,忽略
if mark[cur_i][cur_j] == 1:
continue
# 将该元素标记为已使用
mark[cur_i][cur_j] = 1
if backtrack(cur_i, cur_j, mark, board, word[1:]) == True:
return True
else:
# 回溯
mark[cur_i][cur_j] = 0
return False
#主循环:按行遍历每一个元素,当等于word[0]时才进入递归
for i in range(m):
for j in range(n):
if board[i][j] == word[0]:
# 将该元素标记为已使用
mark[i][j] = 1
if backtrack(i, j, mark, board, word[1:]) == True:
return True
else:
# 回溯
mark[i][j] = 0
return False
# 反思1:
思路二:
题二:96. 不同的二叉搜索树
链接
关键点
- 卡特兰数真的很绝,搜了一下百度百科他还能解决以下问题: n对括号正确匹配数目 凸多边形三角划分 出栈次序 矩阵连乘括号化:矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案。( h(n) 种)
编程思路
Me:
力扣实战
思路一:递归法
class Solution:
def numTrees(self, n: int) -> int:
#思路1:递归 dfs 最外层以每个数字为起点
#思路2:看完标签有个dp,树是中间对称的,个数为奇数是会单一个
#两个辣鸡思路
dp =[0]*(n+1) #dp[i]表示n为i时互不相同的种类数。n为i时,说明i的左子树由1到i-1组成,由dp[i-1]个组成
dp[0]=1 #的方法,右边由i+1到n组成,有dp[n-i]个组法
dp[1]=1
for i in range(2,n+1):
for j in range(0,i): #从0到i-1和从i-1到0,两个数字加起来等于i-1
dp[i] += dp[j]*dp[i-j-1] #
return dp[-1]
# 反思1: