- 思路
- 在递归之前先处理数据
- 做一个map
- >
- 后面这个target,count的map是个treemap因为需要按字母升序排列
- >
- 做一个map
- 递归部分
- 遍历tickets,去map里找
- 如果有
- count>0
- res.add(target)
- count =0
- 可以不处理到最后会return false
- count>0
- 如果没有
- 可以不处理,到最后会return false
- 如果有
- 遍历tickets,去map里找
- 在递归之前先处理数据
-
java class Solution { Deque res; Map> map; public List findItinerary(List> tickets) { map = new HashMap>(); res = new LinkedList<>(); //这里的处理是做一个map //>,后面那个是个treemap,根据题意需要按字母升序排列 for (List t : tickets){ Map temp; // 如果有始发地 if(map.containsKey(t.get(0))){ // temp = map.get(t.get(0)); temp.put(t.get(1), temp.getOrDefault(t.get(1), 0) + 1); }else{ //如果map中没有始发地的key temp = new TreeMap<>();//升序MAP temp.put(t.get(1), 1); } map.put(t.get(0), temp); } res.add("JFK"); helper(tickets.size()); return new ArrayList<>(res); } private boolean helper(int ticketNum){ if(res.size() == ticketNum +1){ return true; } String last = res.getLast(); if(map.containsKey(last)){ for(Map.Entry target : map.get(last).entrySet()){ int count = target.getValue(); if(count > 0){ res.add(target.getKey()); target.setValue(count -1); if(helper(ticketNum)){ return true; } res.removeLast(); target.setValue(count); } } } return false; } }
51. N-Queens
尽在不言中,直接上代码
class Solution {
List<List<String>> result = new ArrayList();
public List<List<String>> solveNQueens(int n) {
char[][] chessboard = new char[n][n];
for(char[] c: chessboard){
Arrays.fill(c,'.');
}
helper(n, 0, chessboard);
return result;
}
private void helper(int n, int row, char[][] chessboard){
if(row == n){
result.add(Array2List(chessboard));
return;
}
for(int col = 0; col < n; col++){
if(isValid(row, col, n, chessboard)){
chessboard[row][col]= 'Q';
helper(n, row + 1, chessboard);
chessboard[row][col] = '.';
}
}
}
public List Array2List(char[][] chessboard){
List<String> list = new ArrayList();
for(char[] c : chessboard){
list.add(String.valueOf(c));
}
return list;
}
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;
}
}
for(int i = row -1, j = col -1; i>=0 && j>=0; i--, j-- ){
if(chessboard[i][j] == 'Q'){
return false;
}
}
for(int i = row - 1, j = col + 1; i >=0 && j <= n-1 ;i--, j++){
if(chessboard[i][j] == 'Q'){
return false;
}
}
return true;
}
}
37. Sudoku Solver
直接上代码
class Solution {
public void solveSudoku(char[][] board) {
helper(board);
}
private boolean helper(char[][] board){
for(int i = 0; i < board[0].length; i++){
for(int j = 0; j < board.length; j++){
if(board[i][j] != '.'){
continue;
}
for(char k = '1'; k <= '9'; k++){
if(isValid(i, j, k, board)){
board[i][j] = k;
if(helper(board)){
return true;
}
board[i][j] = '.';
}
}
return false; // 9个数都试完了,都不行,那么就返回false
}
}
return true;
}
private boolean isValid(int row, int col, char val, char[][] board){
for(int i = 0; i< board[0].length; i++){
if(board[i][col] == val){
return false;
}
}
for(int j = 0; j < board.length; j++){
if(board[row][j] == 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;
}
}