代码随想录训练营day30
题目一:重新安排行程
力扣题目链接
题目描述:
给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。
思路分析:今天的题难度较大,看过代码随想录的思路后,对着代码实现了一遍,以后有机会再深入理解。代码随想录
代码:
class Solution {private Deque<String> res;private Map<String, Map<String, Integer>> map;private boolean backTracking(int ticketNum){if(res.size() == ticketNum + 1){return true;}String last = res.getLast();if(map.containsKey(last)){//防止出现nullfor(Map.Entry<String, Integer> target : map.get(last).entrySet()){int count = target.getValue();if(count > 0){res.add(target.getKey());target.setValue(count - 1);if(backTracking(ticketNum)) return true;res.removeLast();target.setValue(count);}}}return false;}public List<String> findItinerary(List<List<String>> tickets) {map = new HashMap<String, Map<String, Integer>>();res = new LinkedList<>();for(List<String> t : tickets){Map<String, Integer> 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{temp = new TreeMap<>();//升序Maptemp.put(t.get(1), 1);}map.put(t.get(0), temp);}res.add("JFK");backTracking(tickets.size());return new ArrayList<>(res);}
}
题目二:N皇后
力扣题目链接
题目描述:
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位
思路分析:今天的题难度较大,看过代码随想录的思路后,对着代码实现了一遍,以后有机会再深入理解。代码随想录
代码:
class Solution {List<List<String>> res = new ArrayList<>();public List<List<String>> solveNQueens(int n) {char[][] chessboard = new char[n][n];for (char[] c : chessboard) {Arrays.fill(c, '.');}backTrack(n, 0, chessboard);return res;}public void backTrack(int n, int row, char[][] chessboard) {if (row == n) {res.add(Array2List(chessboard));return;}for (int col = 0;col < n; ++col) {if (isValid (row, col, n, chessboard)) {chessboard[row][col] = 'Q';backTrack(n, row+1, chessboard);chessboard[row][col] = '.';}}}public List Array2List(char[][] chessboard) {List<String> list = new ArrayList<>();for (char[] c : chessboard) {list.add(String.copyValueOf(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;}}// 检查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;}
}
题目三:解数独
力扣题目链接
题目描述:编写一个程序,通过填充空格来解决数独问题
思路分析:今天的题难度较大,看过代码随想录的思路后,对着代码实现了一遍,以后有机会再深入理解。代码随想录
代码:
class Solution {public void solveSudoku(char[][] board) {solveSudokuHelper(board);}private boolean solveSudokuHelper(char[][] board){//「一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,// 一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!」for (int i = 0; i < 9; i++){ // 遍历行for (int j = 0; j < 9; j++){ // 遍历列if (board[i][j] != '.'){ // 跳过原始数字continue;}for (char k = '1'; k <= '9'; k++){ // (i, j) 这个位置放k是否合适if (isValidSudoku(i, j, k, board)){board[i][j] = k;if (solveSudokuHelper(board)){ // 如果找到合适一组立刻返回return true;}board[i][j] = '.';}}// 9个数都试完了,都不行,那么就返回falsereturn false;// 因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!// 那么会直接返回, 「这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!」}}// 遍历完没有返回false,说明找到了合适棋盘位置了return true;}/*** 判断棋盘是否合法有如下三个维度:* 同行是否重复* 同列是否重复* 9宫格里是否重复*/private boolean isValidSudoku(int row, int col, char 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;}}// 9宫格里是否重复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;}
}
代码随想录训练营day30相关推荐
- 【代码随想录训练营】Day43-动态规划
代码随想录训练营 Day43 今日任务 1049.最后一块石头的重量Ⅱ 494.目标和 474.一和零 语言:Java 1049. 最后一块石头的重量Ⅱ 链接:https://leetcode.cn/ ...
- 代码随想录训练营day8
目录 题目一:反转字符串 解法一:数值交换 解法二:位运算 题目二:反转字符串|| 题目三:替换空格 解法一:双指针 解法二:使用额外空间 题目四:翻转字符串里的单词 解法一: 解法二:纯属娱乐 题目 ...
- 【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代
理论基础 二叉树的定义形式有:节点指针和数组 在数组中,父节点的下标为i,那么其左孩子的下标即i*2+1,右孩子的下标即为i*2+2 二叉树的常见遍历形式有:前序遍历.后序遍历.中序遍历和层序遍历 前 ...
- 代码随想录训练营day56
题目一:两个字符串的删除操作 力扣题目链接 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数. 每步 可以删除任意一个字符串中的一个字 ...
- 代码随想录训练营day57
题目一:回文子串 力扣题目链接 题目描述: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一 ...
- 代码随想录训练营day53
题目一:最长公共子序列 力扣题目链接 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串的 子序列 ...
- 代码随想录训练营day55
题目一:判断子序列 力扣题目链接 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符 ...
- 代码随想录训练营day52
题目一:最长上升子序列 力扣题目链接 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序. ...
- 代码随想录训练营day48
题目一:打家劫舍 力扣题目链接 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上 ...
最新文章
- elasticsearch5.5.2环境搭建
- java 任意多个整数相加_一个整数分为若干个连续整数之和(使用java实现)
- c语言潮流计算验证30节点,C语言潮流计算研究报告.doc
- 我们眼中的2015年互联网10大产品事件
- python——生成器详解
- SpringBoot中通过自定义缓存注解(AOP切面拦截)实现数据库数据缓存到Redis
- 轻松玩转jquery。
- 保护 wp cron.php,wp-cron.php任务的定时执行和控制
- 牛客 - 云(扫描线)
- 【.NET进程通信】初探.NET中进程间通信的简单的实现
- 泰山医学院计算机文化基础,泰医 专 计算机 16级.pdf
- IterableThread
- 学习总结 java基础
- jQuery 版本升级迁移
- jQuery京剧人物动画
- 技术岗网上测评-智力题
- oppo手机显示服务器连接错误,OPPO手机连不上wifi怎么办?OPPO连不上wifi的四种解决方法...
- Adobe Photoshop 2021 22.4.2 绿色精简版
- 认识计算机系统授课计划,计算机网络技术基础授课计划.doc
- google ble 语音spec(voiceverBLERemotecontrol)