classSolution(object):res =[]path =[]defcombine(self, n, k):""":type n: int:type k: int:rtype: List[List[int]]"""self.res =[]self.path =[]defdfs(n, k, idx):iflen(self.path)== k:self.res.append(self.path[:])return# 站在當前的位置:path已有一些值,則要遍歷idx及之后的所有選項for i inrange(idx, n +1):self.path.append(i)dfs(n, k, i +1)self.path.pop()dfs(n, k,1)return self.res
4.DFS - 括號生成
數字 n 代表生成括號的對數,請你設計一個函數,用于能夠生成所有可能的并且 有效的 括號組合。
有效括號組合需滿足:左括號必須以正確的順序閉合。
classSolution(object):res =[]path =[]defgenerateParenthesis(self, n):""":type n: int:rtype: List[str]"""self.res =[]self.path =[]defdfs(n, l, r):# 出口if r == n:self.res.append("".join(self.path))return# 做選擇# 1.左右括號相等,只能添加左括號if l == r:self.path.append("(")dfs(n, l +1, r)self.path.pop()# 2.左括號大于右括號,且l<n,能添加左也能添加右else:if l < n:# 可以加左括號self.path.append("(")dfs(n, l +1, r)self.path.pop()self.path.append(")")dfs(n, l, r +1)self.path.pop()dfs(n,0,0)return self.res###########################################################################################"""用字符串記錄path,沒有回溯"""classSolution(object):res =[]defgenerateParenthesis(self, n):""":type n: int:rtype: List[str]"""self.res =[]self.find(n,"",0,0)return self.resdeffind(self, n, s, left, right):# 出口if left == n and right == n:self.res.append(s)# 做出所有的選擇# 如果左括號不大于右括號,只能添加左括號elif left <= right:self.find(n, s +"(", left +1, right)# 可以添加右括號,也能添加左括號(如果還能添加)else:if left != n:self.find(n, s +"(", left +1, right)self.find(n, s +")", left, right +1)
5.BFS - 二叉樹的最小深度
找好搜索的結束條件,當一個節點沒有左右子節點時,到達葉節點。
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclassSolution(object):defminDepth(self, root):""":type root: TreeNode:rtype: int"""if root isNone:return0queue =[root]depth =1while(len(queue)>0):length =len(queue)for i inrange(length):temp_node = queue[i]# 結束條件if temp_node.left isNoneand temp_node.right isNone:return depthif temp_node.left isnotNone:queue.append(temp_node.left)if temp_node.right isnotNone:queue.append(temp_node.right)queue = queue[length:]depth +=1
classSolution:defhasPath(self , matrix , word ):defdfs(x, y, m, n, pos):visited[x][y]=True# 在這個層面上做的選擇,不能從子選項中回退path.append(matrix[x][y])if pos ==len(word)-1:returnTrue# 做選擇+撤銷選擇res =Falselx, ly = x, y -1if ly >=0andnot visited[lx][ly]and matrix[lx][ly]== word[pos +1]:res = res or dfs(lx, ly, m, n, pos +1)# visited[lx][ly] = False# path.pop()rx, ry = x, y +1if ry < n andnot visited[rx][ry]and matrix[rx][ry]== word[pos +1]:res = res or dfs(rx, ry, m, n, pos +1)# visited[rx][ry] = False# path.pop()ux, uy = x -1, yif ux >=0andnot visited[ux][uy]and matrix[ux][uy]== word[pos +1]:res = res or dfs(ux, uy, m, n, pos +1)# visited[ux][uy] = False# path.pop()dx, dy = x +1, yif dx < m andnot visited[dx][dy]and matrix[dx][dy]== word[pos +1]:res = res or dfs(dx, dy, m, n, pos +1)# visited[dx][dy] = False# path.pop()visited[x][y]=False# 應該在這里撤銷選擇path.pop()return resm =len(matrix)if m ==0:returnFalsen =len(matrix[0])if n ==0:returnFalsevisited =[[Falsefor _ inrange(n)]for _ inrange(m)]path =[]for i inrange(m):for j inrange(n):if matrix[i][j]== word[0]:res = dfs(i, j, m, n,0)if res:returnTruereturnFalse
如果想在各個選項中“選擇”并“撤銷”,可以采用下面的寫法,但初始條件要修改
classSolution:defhasPath(self , matrix , word ):defdfs(x, y, m, n, pos):if pos ==len(word)-1:returnTrue# 做選擇+撤銷選擇res =False lx, ly = x, y -1if ly >=0andnot visited[lx][ly]and matrix[lx][ly]== word[pos +1]:visited[lx][ly]=True path.append(word[pos +1])res = res or dfs(lx, ly, m, n, pos +1)visited[lx][ly]=False path.pop()rx, ry = x, y +1if ry < n andnot visited[rx][ry]and matrix[rx][ry]== word[pos +1]:visited[rx][ry]=True path.append(word[pos +1])res = res or dfs(rx, ry, m, n, pos +1)visited[rx][ry]=False path.pop()ux, uy = x -1, y if ux >=0andnot visited[ux][uy]and matrix[ux][uy]== word[pos +1]:visited[ux][uy]=True path.append(word[pos +1])res = res or dfs(ux, uy, m, n, pos +1)visited[ux][uy]=False path.pop()dx, dy = x +1, y if dx < m andnot visited[dx][dy]and matrix[dx][dy]== word[pos +1]:visited[dx][dy]=True path.append(word[pos +1])res = res or dfs(dx, dy, m, n, pos +1)visited[dx][dy]=False path.pop()return res m =len(matrix)if m ==0:returnFalse n =len(matrix[0])if n ==0:returnFalse visited =[[Falsefor _ inrange(n)]for _ inrange(m)]for i inrange(m):for j inrange(n):if matrix[i][j]== word[0]:path =[word[0]]visited[i][j]=Trueres = dfs(i, j, m, n,0)if res:returnTrue visited[i][j]=FalsereturnFalse