332.重新安排行程 Reconstruct Itinerary - LeetCode
好难呀。。。写了好多次都不对,
一定要用treeMap才行。。
class Solution {
List<String> res = new ArrayList<>();
public List<String> findItinerary(List<List<String>> tickets) {
//from, dest, number
Map<String, TreeMap<String, Integer>> map = new HashMap<>();
for(List<String> ticket : tickets){
String from = ticket.get(0);
String to = ticket.get(1);
map.putIfAbsent(from, new TreeMap<>());
TreeMap<String, Integer> treeMap = map.get(from);
treeMap.put(to, treeMap.getOrDefault(to, 0) + 1);
}
res.add("JFK");
backtrack(tickets, map, 0);
return res;
}
private boolean backtrack(List<List<String>> tickets, Map<String, TreeMap<String, Integer>> map,int progress){
if(progress == tickets.size()){
return true;
}
TreeMap<String, Integer> tos = map.get(res.get(res.size() - 1));
if(tos == null || tos.isEmpty() || tos.size() == 0)
return false;
for(String str : tos.keySet()){
if(tos.get(str) == 0)
continue;
res.add(str);
tos.put(str, tos.get(str) - 1);
if(backtrack(tickets, map, progress + 1))
return true;
res.remove(res.size() - 1);
tos.put(str, tos.get(str) + 1);
}
return false;
}
}
51. N皇后 N-Queens - LeetCode
三维 res
void backtracking(chessboard, n, row, )
if (row == n)
res.add(chessboard);
return;
for (int i = 0; i < n; i++)
if (isValid(row, i, chessboard, n))
chessboard[row][i] = 'Q';
backtracking(chessboard, n, row + 1);
chessboard[row][i] = '.';
很难bug free啊
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList<>();
char[][] chessboard = new char[n][n];
for (char[] c : chessboard) {
Arrays.fill(c, '.');
}
backtracking(res, n, 0, chessboard);
return res;
}
private void backtracking(List<List<String>> res, int n, int row, char[][] chessboard) {
if (row == n) {
res.add(Array2List(chessboard));
return;
}
for (int i = 0; i < n; i++) {
if (isValid(row, i, n, chessboard)) {
chessboard[row][i] = 'Q';
backtracking(res, n, row + 1, chessboard);
chessboard[row][i] = '.';
}
}
}
public boolean isValid(int row, int col, int n, char[][] chessboard) {
// 检查列
for (int i=0; i<row; ++i) { // 相当于剪枝
if (chessboard[i][col] == 'Q') {
return false;
}
}
// 检查45度对角线
for (int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
// 检查135度对角线
for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
return true;
}
public List Array2List(char[][] chessboard) {
List<String> list = new ArrayList<>();
for (char[] c : chessboard) {
list.add(String.copyValueOf(c));
}
return list;
}
}
37. 解数独 Sudoku Solver - LeetCode
比N皇后多一个维度,两层for循环
boolean backtracking( board)
for (int i = 0; i < board.length; i++)
for(int j = 0; j < board[0].length; j++)
if (board[i][j] == '.')
for (int k = '1'; k <= '9'; k++)
if (isValid(i, j, k, board)
board[i][j] = k;
boolean res = backtracking(board;
if (res == true)return true;
board[i][j] = '.';
return false;//当9个数都不满足,直接return false;
return true;
class Solution {
public void solveSudoku(char[][] board) {
backtracking(board);
}
private boolean backtracking(char[][] board) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (board[i][j] == '.') {
for (char k = '1'; k <= '9'; k++) {
if (isValid(i, j, k, board)) {
board[i][j] = k;
if (backtracking(board)) {
return true;
}
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
private boolean isValid(int row, int col, int val, char[][] board) {
for (int i = 0; i < 9; i++) {
if (board[row][i] == val) {
return false;
}
}
for (int j = 0; j < 9; j++) {
if (board[j][col] == val) {
return false;
}
}
int startRow = (row / 3) * 3;
int startCol = (col / 3) * 3;
for (int i = startRow; i < startRow + 3; i++) {
for (int j = startCol; j < startCol + 3; j++) {
if (board[i][j] == val) {
return false;
}
}
}
return true;
}
}
● 总结
感觉这个list很好,都是backtracking的经典题目。