LeetCode刷题笔记之回溯算法(二)

一、排列问题

排列是有序的,即{1,2}与{2,1}是两个排序。

1. 46【全排列】

  • 题目: 给定一个不含重复数字的数组 nums ,返回其所有可能的全排列。你可以按任意顺序返回答案。
  • 代码:
class Solution {List<List<Integer>> ansList = new ArrayList<>();List<Integer> path = new LinkedList<>();public List<List<Integer>> permute(int[] nums) {//排列是有序的,因此每一层用过的元素,在下一层还可以使用//但是需要记录在同一递归循环中是否使用过该元素//终止条件是path中的元素个数==nums.lengthboolean[] used = new boolean[nums.length];backtrack(nums,used);return ansList;}public void backtrack(int[] nums,boolean[] used){if(path.size() == nums.length) {ansList.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if(used[i]) continue;path.add(nums[i]);used[i] = true;backtrack(nums,used);path.removeLast();used[i] = false;}}
}

2. 47【全排列 II】

  • 题目: 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
  • 代码:
class Solution {public List<List<Integer>> ansList = new ArrayList<>();public List<Integer> path = new LinkedList<>();public List<List<Integer>> permuteUnique(int[] nums) {//本题与上一题的区别是本题含有重复数据//因此在每一递归层需要判断前面是否出现过相同元素//此外输入数组不一定是有序的,因此需要对数组进行排序Arrays.sort(nums);boolean[] used = new boolean[nums.length];backtrack(nums,used);return ansList;}public void backtrack(int[] nums,boolean[] used){if(path.size() == nums.length){ansList.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if(i>0 && nums[i]==nums[i-1]) {//如果上一个与当前元素相等的数被使用过,则代表两个数位于同一递归分支//我们需要对同一递归层中相同的元素进行剪枝,也就是说上一个元素不能被使用if(!used[i-1]) continue;}if(!used[i]){path.add(nums[i]);used[i] = true;backtrack(nums,used);path.removeLast();used[i] = false;}}}
}

二、棋盘问题

1. 51【N皇后】

  • 题目: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
  • 代码:
class Solution {List<List<String>> ansList = new ArrayList<>();public List<List<String>> solveNQueens(int n) {//N皇后问题:皇后的位置不能同行,同列,对角//棋盘是个n×n的数组,因此可以将第i行看成树的第i层//第j列看成树的第j个分支char[][] chessboard = new char[n][n];for(char[] cArr: chessboard){Arrays.fill(cArr,'.');}backtrack(n,chessboard,0);return ansList;}public void backtrack(int n,char[][] chessboard,int row){if(row == n){List<String> sList = new ArrayList<>();for (char[] cArr:chessboard) {sList.add(String.valueOf(cArr));}ansList.add(sList);}for (int col = 0; col <n ; col++) {if(isValid(n,chessboard,row,col)){chessboard[row][col] = 'Q';backtrack(n,chessboard,row+1);chessboard[row][col] ='.';}}}public boolean isValid(int n,char[][] chessboard,int row,int col){//因为一行只能有1个皇后,所以不需要检查第row行是否合法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; i--,j++) {if(chessboard[i][j] == 'Q'){return false;}}return true;}
}

2. 52【N皇后Ⅱ】

  • 题目: n皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
    给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
  • 代码:
class Solution {int num = 0;public int totalNQueens(int n) {char[][] board = new char[n][n];for(char[] c:board){Arrays.fill(c,'.');}backtrack(n,board,0);return num;}public void backtrack(int n,char[][] board,int row){if(row == n){num++;return;}for (int col = 0; col < n; col++) {if(isValid(row,col,board,n)){board[row][col] = 'Q';backtrack(n,board,row+1);board[row][col] = '.';}}}public boolean isValid(int row,int col,char[][] board,int n){for (int i = 0; i < row; i++) {if(board[i][col] == 'Q'){return false;}}for(int i=row-1,j=col-1;i>=0 && j>=0;i--,j--){if(board[i][j] == 'Q'){return false;}}for(int i=row-1,j=col+1;i>=0 && j<n;i--,j++){if(board[i][j] == 'Q'){return false;}}return true;}
}

3. 37【解数独】

  • 题目: 编写一个程序,通过填充空格来解决数独问题。数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
    数独的解法需 遵循如下规则:
    • 数字 1-9 在每一行只能出现一次。
    • 数字 1-9 在每一列只能出现一次。
    • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
  • 代码:
class Solution {public void solveSudoku(char[][] board) {//数独问题与N皇后问题不同,N皇后每次递归对行进行一次操作//而数独需要多次对同一行进行操作//所以使用两个for循环来进行递归//每次for循环找到符合条件的值就不在继续进行,因此回溯需要有boolean返回值backtrack(board);}public boolean backtrack(char[][] board){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++) {if(isValid(i,j,k,board)){board[i][j] = k;if(backtrack(board)) return true;board[i][j] = '.';}}return false;}}return true;}public boolean isValid(int row,int col,char k,char[][] board){//判断行for (int i = 0; i < 9; i++) {if(board[i][col] == k){return false;}}//判断列for (int i = 0; i < 9; i++) {if(board[row][i] == k){return false;}}for (int i = (row/3)*3; i < (row/3)*3+3; i++) {for (int j = (col/3)*3; j < (col/3)*3+3; j++) {if(board[i][j] == k){return false;}}}return true;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 正测试Android屏幕小组件;联想ThinkBook 推出透明笔记本电脑

▶ ChatGPT 测试屏幕小组件 近日 ChatGPT 正在测试 Android 平台上的屏幕小组件&#xff0c;类似于手机中的悬浮窗&#xff0c;按住 Android 手机主屏幕上的空白位置就可以调出 ChatGPT 的部件菜单。 菜单中提供了许多选项&#xff0c;包括文本、语音和视频查询的快捷方式&…

第102讲:MySQL多实例与Mycat分布式读写分离的架构实践

文章目录 1.Mycat读写分离分布式架构规划2.在两台服务器中搭建八个MySQL实例2.1.安装MySQL软件2.2.创建每个MySQL实例的数据目录并初始化2.3.准备每个实例的配置文件2.4.准备每个实例的启动脚本2.6启动每台机器的MySQL多实例2.7.为每个MySQL实例设置密码2.8.查看每个MySQL实例的…

蓝桥杯第十四届电子类单片机组决赛程序设计

目录 前言 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十四届比赛题目 1.比赛题目 2.题目解读 1&#xff09;任务要求 2&#xff09;注意事项 二、显示功能实现 1.关于高位为0时数码管熄灭功能的实现 2.关于显示小数位的处理 3.关于“校准值”的…

Nginx反向代理ip透传与负载均衡

前言 上篇介绍了nginx服务器单向代理和动静分离等相关内容&#xff0c;可参考Nginx重写功能和反向代理-CSDN博客&#xff0c;这里就ip透传和负载均衡对nginx反向代理做进一步了解。 目录 一、客户端ip透传 1. 概述 2. 一级代理 2.1 图示 2.2 操作过程 3. 二级代理 3.…

使用ffmpeg压缩视频

一、到ffmpeg官网下载文件包&#xff1a; Download FFmpeg 下载后找到 bin 下的3个exe文件&#xff0c;复制到自己本机的某个目录下, 如&#xff1a; 二、使用命令行压缩&#xff1a; ffmpeg -i input.mp4 -c:v libx265 -crf 28 -y output.mp4 这条命令使用 FFmpeg 工具对输…

机器学习——线性代数中矩阵和向量的基本介绍

矩阵和向量的基本概念 矩阵的基本概念&#xff08;这里不多说&#xff0c;应该都知道&#xff09; 而向量就是一个特殊的矩阵&#xff0c;即向量只有一列&#xff0c;是个n*1的矩阵 注&#xff1a;一般矩阵用大写字母表示&#xff0c;向量用小写字母表示 矩阵的加减运算 两个…

大语言模型LLM推理加速主流框架(LLM系列10)

文章目录 大语言模型LLM推理加速主流框架&#xff08;LLM系列10&#xff09;引言大语言模型推理基础LLM推理加速的主要途径模型优化技术硬件加速软件层面优化 主流LLM推理框架集成概述TensorRT-LLMPyTorch/TensorFlow Serving其他框架与工具 实例分析与应用案例** 大语言模型LL…

大语言模型LLM推理加速:LangChain与ChatGLM3-6B的推理加速技术(LLM系列11)

文章目录 大语言模型LLM推理加速&#xff1a;LangChain与ChatGLM3-6B的推理加速技术&#xff08;LLM系列11&#xff09;引言LangChain框架下的推理优化LangChain的核心理念与功能特点分布式计算与知识图谱集成优化推理路径实例分析&#xff1a;使用链式查询与缓存机制提升模型推…

前端架构: 脚手架命令行交互核心实现之inquirer和readline的应用教程

命令行交互核心实现 核心目标&#xff1a;实现命令行行交互&#xff0c;如List命令行的交互呢比命令行的渲难度要更大&#xff0c;因为它涉及的技术点会会更多它涉及以下技术点 键盘输入的一个监听 (这里通过 readline来实现)计算命令行窗口的尺寸清屏光标的移动输出流的静默 …

AUTOSAR通信篇 -Communication(COM)

文章目录 模块依赖PDU RouterCom UserRuntime Environment(RTE)SwCluC功能介绍通用功能AUTOSAR COM基础大小端转换和符号扩展过滤信号网关正常操作启动行为前置条件初始化

关于年化收益率的思考

近期&#xff0c;对于投资的年化收益率有一些思考&#xff0c;想着将这些思考整理一下&#xff0c;顺便也就记录在这里。 1. 计算方式 年化收益率常见的计算有三种&#xff1a;算数平均&#xff0c;几何平均&#xff0c;IRR。 1.1 算术平均 算数平均用于度量产品的回报率&a…

MetaGPT 1 安装与配置踩坑实录

安装 与 配置直接参考这里就行&#xff1a;Hugging Muti Agent&#xff08;二月学习&#xff09; - 飞书云文档 (feishu.cn) 这里按照教程安装的是metagpt 0.6.6 &#xff0c;经过跟0.7.0对比&#xff0c;个人认为0.7对其他llm接入可能更好&#xff0c;文档也更清晰。 0.6.6的…

uniapp android 原生插件开发-测试流程

前言 最近公司要求研究一下 uniapp 的 android 原生插件的开发&#xff0c;为以后的工作做准备。这篇文章记录一下自己的学习过程&#xff0c;也帮助一下有同样需求的同学们 : ) 一、下载安装Hbuilder X , Android studio&#xff08;相关的安装配置过程网上有很多&#xff0c;…

springboot + easyRules 搭建规则引擎服务

依赖 <dependency><groupId>org.jeasy</groupId><artifactId>easy-rules-core</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.jeasy</groupId><artifactId>easy-rules…

阿里巴巴淘口令API的安全保障措施在电商领域的应用与实践

在电商领域&#xff0c;阿里巴巴淘口令API的安全保障措施是非常重要的&#xff0c;因为它们确保了数据的机密性、完整性和可用性。以下是一些关于阿里巴巴淘口令API安全保障措施在电商领域的应用与实践&#xff0c;并附带相关代码示例&#xff1a; 1. 身份验证和授权 应用示例…

VoIP之AVPF(Audio-Visual Profile with Feedback)

在VoIP音视频通话中&#xff0c;接收者可以依赖rtcp机制向发送者报告RTP数据接收的统计情况&#xff0c;以便发送者根据接收情况&#xff08;丢包数量等&#xff09;调整传输行为&#xff08;发送速率等&#xff09;。由于基本的RTCP统计报告是定期发送的&#xff0c;通过该机制…

安全运营中心(SOC)综合指南

什么是安全运营中心&#xff08;SOC&#xff09; 安全运营中心&#xff0c;也称为信息安全运营中心 &#xff08;ISOC&#xff09;&#xff0c;是结构良好的网络安全战略的核心。安全运营中心是一个集中式枢纽&#xff0c;无论是在组织内部还是外包&#xff0c;都致力于对整个…

云计算时代的运维: 职业发展方向与岗位选择

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

Nginx网络服务五-----rewrite和反向代理

1.rewrite 1.1rewrite指令 通过正则表达式的匹配来改变URI&#xff0c;可以同时存在一个或多个指令&#xff0c;按照顺序依次对URI进行匹配&#xff0c;rewrite主要是针对用户请求的URL或者是URI做具体处理 官方文档&#xff1a; https://nginx.org/en/docs/http/ngx_http_r…

numpy数组索引

文章目录 简介索引方法 简介 numpy是python中最常用的科学计算包&#xff0c;而数组则是是numpy的核心类型&#xff0c;也是Python称为科学计算领域首选语言的关键类型&#xff0c;可以不夸张地说&#xff0c;正是数组类型的强大与易用性&#xff0c;筑就了Python帝国。 和Py…