代码随想录算法训练营第三十天| 332.重新安排行程, 第51题. N皇后, 37. 解数独

本文介绍了如何使用递归策略和数据结构(如Map和Treemap)解决旅行商问题。通过构建一个目标城市计数的映射,并在递归过程中更新路径,作者展示了如何找到最少飞行次数的旅行路线。涉及的Java代码展示了核心算法和关键步骤。
摘要由CSDN通过智能技术生成
  • 思路
    • 在递归之前先处理数据
      • 做一个map
        • >
          • 后面这个target,count的map是个treemap因为需要按字母升序排列
    • 递归部分
      • 遍历tickets,去map里找
        • 如果有
          • count>0
            • res.add(target)
          • count =0
            • 可以不处理到最后会return false
        • 如果没有
          • 可以不处理,到最后会return false
  • 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值