LeetCode——回溯篇(三)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com

目录

46. 全排列

47. 全排列 II

332. 重新安排行程

51. N 皇后

37. 解数独


 

46. 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 全排列* @create 2023-08-30 9:36*/
public class PermuteTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < n; i++) {nums[i]=input.nextInt();}System.out.println(permute(nums));}public static List<List<Integer>> res=new ArrayList<>();public static List<Integer> path=new ArrayList<>();public static List<List<Integer>> permute(int[] nums) {int[] used=new int[nums.length]; //记录数组中哪个元素已经使用过了Arrays.fill(used,0);backtracking(nums,used);return res;}private static void backtracking(int[] nums,int[] used) {if(path.size()==nums.length){res.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if(used[i]==0){path.add(nums[i]);used[i]=1;backtracking(nums,used);//回溯path.remove(path.size()-1);used[i]=0;}}}
}

47. 全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

输入:nums = [1,1,2]
输出:
[[1,1,2],[1,2,1],[2,1,1]]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 全排列II**给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。** (需要去重* @create 2023-08-30 9:59*/
public class PermuteUniqueTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < n; i++) {nums[i]=input.nextInt();}System.out.println(permuteUnique(nums));}public static List<List<Integer>> res=new ArrayList<>();public static List<Integer> path=new ArrayList<>();public static List<List<Integer>> permuteUnique(int[] nums) {Arrays.sort(nums);int[] used=new int[nums.length]; //记录数组中哪个元素已经使用过了--同时去重Arrays.fill(used,0);backtracking(nums,used);return  res;}private static void backtracking(int[] nums, int[] used) {if(path.size()== nums.length){res.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {//去重逻辑if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0){continue;}if(used[i]==0){ //数组元素还未使用path.add(nums[i]);used[i]=1;backtracking(nums,used);//回溯path.remove(path.size()-1);used[i]=0;}}}
}

332. 重新安排行程

给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。

所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。

  • 例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前。

假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。

 

public class FindItineraryTest {public LinkedList<String> res;public LinkedList<String> path=new LinkedList<>();public List<String> findItinerary(List<List<String>> tickets) {//对集合中元素降落地点排序Collections.sort(tickets, new Comparator<List<String>>() {@Overridepublic int compare(List<String> o1, List<String> o2) {return o1.get(1).compareTo(o2.get(1));}});path.add("JFK"); //从JFK出发boolean[] used=new boolean[tickets.size()]; //判断元素是否重复Arrays.fill(used,false);backtracking((ArrayList)tickets,used);return res;}private boolean backtracking(ArrayList<List<String>> tickets, boolean[] used) {//终止条件if(path.size()==tickets.size()+1){res=new LinkedList<>(path);  //只有一条路径return true;}for (int i = 0; i < tickets.size(); i++) {//未使用重复元素并且path中最后一个元素的值等于tickets数组航班中的起飞航班,则将降落航班加入path中if(!used[i]&&tickets.get(i).get(0).equals(path.getLast())){path.add(tickets.get(i).get(1));used[i]=true;if(backtracking(tickets,used)){return true;}//回溯used[i]=false;path.removeLast();}}return false;}}

51. N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description N皇后* @create 2023-08-30 11:13*/
public class SolveNQueensTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();System.out.println(solveNQueens(n));}public static List<List<String>> res=new ArrayList<>();public static List<List<String>> solveNQueens(int n) {char[][] chessboard = new char[n][n];for (char[] c : chessboard) {Arrays.fill(c, '.');}backtracking(chessboard,n,0);return res;}//row:行--控制递归深度private static void backtracking(char[][] chessboard, int n, int row) {//终止条件--收获结果if(row==n){res.add(arrayToList(chessboard));return;}//单层递归逻辑for (int col = 0; col < n; col++) {//判断是否合法位置if(isValid(chessboard,row,col,n)){chessboard[row][col]='Q';backtracking(chessboard,n,row+1);//回溯chessboard[row][col]='.';}}}private static List<String> arrayToList(char[][] chessboard) {List<String> path=new ArrayList<>();for (int i = 0; i < chessboard.length; i++) {path.add(String.valueOf(chessboard[i]));}return path;}/*验证棋盘是否合法按照如下标准去重:1.不能同行2.不能同列3.不能同斜线 (45度和135度角)*/private static boolean isValid(char[][] chessboard, int row, int col, int n) {检查行  (可以不用检查行,每一次递归,row+1//for (int i = 0; i < col; i++) {//	if(chessboard[row][i]=='Q'){//		return false;//	}//}//检查列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 ; i--,j++) {if(chessboard[i][j]=='Q'){return false;}}return true;}}

37. 解数独

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。


/*** @author light* @Description 解数独** @create 2023-08-30 12:19*/
public class SolveSudokuTest {public static void solveSudoku(char[][] board) {backtracking(board);}private static boolean backtracking(char[][] board) {for (int i = 0; i < 9; i++) { //行for (int j = 0; j < 9; j++) { //列if(board[i][j]!='.'){continue;}else {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]='.';}}// 9个数都试完了,都不行,那么就返回falsereturn false;}}}return true;}/*** 判断棋盘是否合法有如下三个维度:*     同行是否重复*     同列是否重复*     9宫格里是否重复*/private static boolean isValid(int row, int col, char val,char[][] board) {//同行是否重复for (int i = 0; i < 9; i++) {if(board[row][i]==val){return false;}}//同列是否重复for (int i = 0; i <9; i++) {if(board[i][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;}
}

 

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

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

相关文章

概念解析 | 量子时代的灵感:探索量子感知技术

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:量子感知技术。 量子时代的灵感:探索量子感知技术 量子感知技术是一个充满希望和挑战的新兴领域。在此,我们将深入探讨这个主题,概述其背景,解释其工作原理,讨论现有的…

如何实现AI的矢量数据库

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 然而&#xff0c;人工智能模型有点像美食厨师。他们可以创造奇迹&#xff0c;但他们需要优质的成分。人工智能模型在大多数输入上都做得很好&#xff0c;但如果它们以最优化的格式接收输入&#xff0c;它们就会真正…

机器学习——KNN算法

1、&#xff1a;前提知识 KNN算法是机器学习算法中用于分类或者回归的算法&#xff0c;KNN全称为K nearest neighbour&#xff08;又称为K-近邻算法&#xff09; 原理&#xff1a;K-近邻算法采用测量不同特征值之间的距离的方法进行分类。 优点&#xff1a;精度高 缺点&…

【传输层】网络基础 -- UDP协议 | TCP协议

再谈端口号端口号范围划分netstatpidof UDPUDP的特点面向数据报UDP的缓冲区 基于UDP的应用层协议 TCP认识TCP协议的报头理解封装解包理解可靠性TCP工作模式16位窗口大小6位标志位URGACKPSHRSTSYNFIN 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/I…

数据结构--树4.2(二叉树)

目录 一、二叉树的定义和特点 1、定义 2、特点 二、二叉树的基本形态 1、空二叉树 2、只有一个根结点 3、根结点只有左子树 4、根结点只有右子树 5、根结点既有左子树又有右子树 6、斜树 7、满二叉树 8、满二叉树和完全二叉树 三、二叉树的性质 一、二叉树的定义和…

做区块链卡牌游戏有什么好处?

区块链卡牌游戏是一种基于区块链技术的创新性游戏形式&#xff0c;它将传统的卡牌游戏与区块链技术相结合&#xff0c;实现了去中心化、数字化资产的交易和收集。这种新型游戏形式正逐渐在游戏行业引起了广泛的关注和热潮。本文将深入探讨区块链卡牌游戏的定义、特点以及其在未…

【已解决】激活虚拟环境报错:此时不应有Anaconda3\envs\[envs]\Library\ssl\cacert.pem。

新建虚拟环境后&#xff0c;进入虚拟环境的时候出现这样的报错&#xff1a; 此时不应有Anaconda3 envs yolov5 Library ssl cacert.pem。 但是之前装的虚拟环境也还能再次激活&#xff0c;base环境也无任何问题&#xff0c;仅新装的虚拟环境无法激活。 查遍了百度谷歌&#xff…

集丰照明|汽车美容店设计,装修色彩灯光搭配方法

正确处理好店面的空间设计。 店铺各个功能区设计要合理&#xff0c;衔接合理&#xff0c;这样既能提高员工的工作效率也能提高顾客的满意度。合理安排店铺的空间分配&#xff0c; 要给顾客一种舒适度&#xff0c;既不能让顾客感觉到过于拥挤&#xff0c;又不能浪费店铺的有限空…

安达发|2024年,APS计划排产技术应运而生

随着制造业竞争加剧&#xff0c;企业如何提高生产效率、降低成本、满足客户需求成为关键。2024年&#xff0c;APS计划排产技术应运而生&#xff0c;通过实施APS自动排程&#xff0c;企业将获得诸多效益。 近年来&#xff0c;全球制造业正面临着原材料价格波动、人工成本上升、环…

Google登录SDK

一、接入的准备工作 官方文档链接地址&#xff1a;开始使用一键登录和注册 按照步骤进行接入即可 二、项目参考&#xff08;Unity项目&#xff09; 注意&#xff1a;代码版本如果不适用新的Google API 请自行参考最新版本接口 SDKGoogleSignInActivity 主要用于登录的代码。Un…

设计模式备忘录+命令模式实现Word撤销恢复操作

文章目录 前言思路代码实现uml类图总结 前言 最近学习设计模式行为型的模式&#xff0c;学到了备忘录模式提到这个模式可以记录一个对象的状态属性值&#xff0c;用于下次复用&#xff0c;于是便想到了我们在Windows系统上使用的撤销操作&#xff0c;于是便想着使用这个模式进…

DCL介绍

文章目录 1. 简介2. DCL管理用户3. DCL权限控制 1. 简介 DCL英文全称为&#xff08;数据控制语言&#xff09;&#xff0c;用来管理数据库用户、控制数据库的访问权限 2. DCL管理用户 查询用户 Use mysql; select * from user;创建用户 create user 用户名主机名 Identifi…