332.重新安排行程
几个难点:
- 一个行程中,如果航班处理不好容易变成一个圈,成为死循环
- 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ?
- 使用回溯法(也可以说深搜) 的话,那么终止条件是什么呢?
- 搜索的过程中,如何遍历一个机场所对应的所有机场.
class Solution:
def findItinerary(self, tickets: List[List[str]]) -> List[str]:
tickets_dict = defaultdict(list)
for ticket in tickets:
tickets_dict[ticket[0]].append(ticket[1])
for item in tickets_dict:
tickets_dict[item].sort()
path = ['JFK']
def backtracking(startindex):
if len(path) == len(tickets) + 1:
return path
for i in tickets_dict[startindex]:
end = tickets_dict[startindex].pop(0)
path.append(end)
if backtracking(end): return path
path.pop()
tickets_dict[startindex].append(end)
backtracking('JFK')
return path
51. N皇后
解题细节:is_valid function
- 不能同行
- 不能同列
- 不能同斜线 (45度和135度角)
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
board = [['.'] * n for _ in range(n)]
res = []
def backtracking(board,n,row):
if row == n:
path = []
for item in board:
path_row = ''.join(item)
path.append(path_row)
res.append(path)
for i in range(n):
if not is_valid(board,row,i):
continue
board[row][i] = 'Q'
backtracking(board,n,row+1)
board[row][i] = '.'
def is_valid(board,row,indx):
#判断同一列是否冲突
for i in range(len(board)):
if board[i][indx] == 'Q':
return False
# 判断左上角是否冲突
i = row -1
j = indx -1
while i>=0 and j>=0:
if board[i][j] == 'Q':
return False
i -= 1
j -= 1
# 判断右上角是否冲突
i = row - 1
j = indx + 1
while i>=0 and j < len(board):
if board[i][j] == 'Q':
return False
i -= 1
j += 1
return True
backtracking(board,n,0)
return res