代码随想录 回溯算法-排序

目录

46.全排序 

47.全排列|| 

332.重新安排行程


46.全排序 

46. 全排列

中等

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

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

 

 通过全局变量used数组进行树枝去重

class Solution {  // 存储所有可能的排列结果的列表  List<List<Integer>> result = new ArrayList<>();  // 存储当前正在构建的排列的列表  List<Integer> path = new ArrayList<>();  // 标记数组,用于记录数字是否已经被使用  int[] used;  // 外部接口方法,用于获取数字数组的所有排列  public List<List<Integer>> permute(int[] nums) {  // 初始化used数组,大小为21,因为题目中暗示了nums中的元素范围为[0, 10],所以偏移10后使用  used = new int[nums.length];  // 开始回溯过程  backtracking(nums);  // 返回所有可能的排列结果  return result;  }  // 回溯方法,用于生成排列  public void backtracking(int[] nums){  // 如果当前路径的长度等于nums的长度,说明一个排列已经生成完毕  if(path.size() == nums.length){  // 将当前路径添加到结果列表中  result.add(new ArrayList(path));  // 结束当前递归分支  return;  }  // 遍历nums数组中的每个元素  for(int i = 0; i < nums.length; i++){  // 如果当前元素已经被使用,则跳过  if(used[i] == 1){  continue;  }  // 将当前元素添加到路径中  path.add(nums[i]);  // 标记当前元素为已使用  used[i] = 1;  // 继续递归生成下一个位置的元素  backtracking(nums);  // 回溯,撤销选择,标记当前元素为未使用  used[i] = 0;  // 回溯,撤销选择,从路径中移除当前元素  path.removeLast();  }  }  
}

47.全排列|| 

47. 全排列 II

中等

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

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],[1,2,1],[2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

 

这里要用到树枝去重和树层去重,树枝去重使用used数组,和之前的方式一样,树层去重去 

class Solution {  // 存储所有可能的排列结果的列表  List<List<Integer>> result = new ArrayList<>();  // 存储当前正在构建的排列的列表  List<Integer> path = new ArrayList<>();  // 标记数组,用于记录数字是否已经被使用  int[] used;  // 外部接口方法,用于获取数字数组的所有不重复排列  public List<List<Integer>> permuteUnique(int[] nums) {  // 初始化used数组,大小为nums的长度  used = new int[nums.length];  // 对nums数组进行排序,以便在回溯过程中跳过重复元素  Arrays.sort(nums);  // 开始回溯过程  backtracking(nums);  // 返回所有可能的排列结果  return result;  }  // 回溯方法,用于生成不重复排列  public void backtracking(int[] nums){  // 如果当前路径的长度等于nums的长度,说明一个排列已经生成完毕  if(path.size() == nums.length){  // 将当前路径添加到结果列表中  result.add(new ArrayList<>(path));  // 结束当前递归分支  return;  }  // 遍历nums数组中的每个元素  for(int i = 0; i < nums.length; i++){  // 如果当前元素和前一个元素相同,并且前一个元素未被使用,则跳过当前元素  // 这样可以避免生成包含重复元素的排列  if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0){  continue;  }  // 如果当前元素已经被使用,则跳过  if(used[i] == 1){  continue;  }  // 将当前元素添加到路径中  path.add(nums[i]);  // 标记当前元素为已使用  used[i] = 1;  // 继续递归生成下一个位置的元素  backtracking(nums);  // 回溯,撤销选择,标记当前元素为未使用  used[i] = 0;  // 回溯,撤销选择,从路径中移除当前元素  path.removeLast();  }  }  
}

332.重新安排行程

332. 重新安排行程

困难

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

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

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

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

示例 1:

输入:tickets = [["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]]
输出:["JFK","MUC","LHR","SFO","SJC"]

示例 2:

输入:tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
输出:["JFK","ATL","JFK","SFO","ATL","SFO"]
解释:另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"] ,但是它字典排序更大更靠后。

提示:

  • 1 <= tickets.length <= 300
  • tickets[i].length == 2
  • fromi.length == 3
  • toi.length == 3
  • fromi 和 toi 由大写英文字母组成
  • fromi != toi

这里先对传入的集合排序是为了先访问到字典排序更小的元素,backtracking返回boolean是为了只找一个有效行程,先找到的那个有效行程一定是字典排序更小的 ,用used数组来进行树枝去重

class Solution {  // 结果列表,存储最终的旅行行程  private ArrayList<String> res;  // 当前构建的行程路径  private ArrayList<String> path = new ArrayList<>();//去重int[] used;  // 主方法,用于找到旅行行程  public List<String> findItinerary(List<List<String>> tickets) {  // 将tickets按照目的地(即第二个元素)进行排序  // 这样能够确保回溯时优先选择目的地字母顺序靠前的航班  Collections.sort(tickets, (a, b) -> a.get(1).compareTo(b.get(1)));  // 起点是"JFK"  path.add("JFK");  // 标记数组,用于记录机票是否已被使用  used = new int[tickets.size()];  // 开始回溯  backTracking(tickets);  // 返回最终构建的旅行行程  return res;  }  // 回溯方法,用于生成旅行行程  public boolean backTracking(List<List<String>> tickets) {  // 如果路径中的机场数量等于机票数量加1(因为起点"JFK"也算一个点)  // 则说明已经构建了一个完整的旅行行程  if (path.size() == tickets.size() + 1) {  // 将当前路径赋值给结果列表  res = new ArrayList<>(path);  // 找到了一个完整的行程,返回true  return true;  }  // 遍历所有机票  for (int i = 0; i < tickets.size(); i++) {  // 如果机票未被使用,且当前机票的起点与当前路径的最后一个机场相同  if (used[i] == 0 && tickets.get(i).get(0).equals(path.getLast())) {  // 将当前机票的终点添加到路径中  path.add(tickets.get(i).get(1));  // 标记当前机票为已使用  used[i] = 1;  // 继续回溯,寻找下一个机票  if (backTracking(tickets)) {  // 如果找到了一个完整的行程,则直接返回true  return true;  }  // 回溯,撤销选择  // 标记当前机票为未使用  used[i] = 0;  // 从路径中移除当前机票的终点  path.removeLast();  }  }  // 如果无法构建完整的行程,则返回false  return false;  }  
}

 

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

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

相关文章

关于出国留学和考研比较----以本人双非跨考计算机为例

文章目录 中心论点国内就业现状勿让旧认知害了自己那出国留学真的一无是处了吗?1. 藤校仍旧是具有极高价值2. 时间成本低3. 研究生一定比单纯的本科找工作强!4. 很多人说出国读博好,可以无脑入,真是这样吗? 中心论点 如果在选择出国留学还是国内考研的最终核心诉求都是有更好…

985硕的4家大厂实习与校招经历专题分享(part2)

我的个人经历&#xff1a; 985硕士24届毕业生&#xff0c;实验室方向:CV深度学习 就业&#xff1a;工程-java后端 关注大模型相关技术发展 校招offer: 阿里巴巴 字节跳动 等10 研究生期间独立发了一篇二区SCI 实习经历:字节 阿里 京东 B站 &#xff08;只看大厂&#xff0c;面试…

(MATLAB)第十二章-数列与极限

目录 12.1 数列 12.1.1 数列求和 1. 累计求和函数sum() 2. 忽略NaN累计求和函数 nansum() 3. 求此元素位置之前的元素和函数cumsum() 4. 求梯形累计和函数cumtrapz() 12.1.2 数列求积 1. 元素连续相乘函数 prod() 2. 求累计积函数 cumprod() 3. 阶乘函数 ffactorial(n…

【C++精简版回顾】18.文件操作

1.文件操作头文件 2.操作文件所用到的函数 1.文件io 1.头文件 #include<fstream> 2.打开文件 &#xff08;1&#xff09;函数名 文件对象.open &#xff08;2&#xff09;函数参数 /* ios::out 可读 ios::in 可…

【C++】C++模板基础知识篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化…

基于Java的生活废品回收系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

硬盘温度过高会怎么办?机箱温度多少算正常?

硬盘温度 硬盘在使用过程中&#xff0c;断电很容易导致数据丢失&#xff0c;但如果温度过高&#xff0c;也可能对硬盘造成损坏。 硬盘的温度是决定电脑能否正常使用的重要因素。 如果长时间读取和存储数据&#xff0c;硬盘的温度会升高。 那么&#xff0c;硬盘的正常温度是多少…

万字详解,Java实现低配版线程池

文章目录 1.什么是线程池2.线程池的优势3.原理4.代码编写4.1 阻塞队列4.2 ThreadPool线程池4.3 Worker工作线程4.4 代码测试 5. 拒绝策略5.1 抽象Reject接口5.2 BlockingQueue新增tryPut方法5.3 修改ThreadPool的execute方法5.4 ThreadPool线程池构造函数修改5.5 拒绝策略实现1…

利用“定时执行专家”循环执行BAT、VBS、Python脚本——含参数指定功能

目录 一、软件概述 二、VBS脚本执行设置 三、触发器设置 四、功能亮点 五、总结 在自动化办公和日常计算机任务管理中&#xff0c;定时执行脚本是一项非常重要的功能。今天&#xff0c;我将为大家带来一款名为“定时执行专家”的软件的评测&#xff0c;特别是其定时执行VB…

Android中的传感器类型和接口名称

本文将介绍传感器坐标轴、基础传感器和复合传感器&#xff08;动作传感器、姿势传感器、未校准传感器和互动传感器&#xff09;。 1. 传感器坐标轴 许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。 1.1 移动设备坐标轴 Sensor API 仅与屏幕的自然方向相关&a…

MySQL面试题-锁(答案版)

锁 1、MySQL 有哪些锁&#xff1f; &#xff08;1&#xff09;全局锁 加了全局锁之后&#xff0c;整个数据库就处于只读状态了&#xff0c;这时其他线程执行以下操作&#xff0c;都会被阻塞&#xff1a; 对数据的增删改操作&#xff0c;比如 insert、delete、update等语句&…

【Git】merge时报错:refusing to merge unrelated histories

文章目录 一、问题二、解决办法1、将feature分支的东西追加到master分支中2、将feature里的东西直接覆盖到master分支中 一、问题 今天将feature分支合并到master时报错&#xff1a;refusing to merge unrelated histories&#xff08;拒绝合并无关历史&#xff09; 报错原因&…

IDEA自带 .http 请求工具文档

基础语法 请求格式 基础格式 Method Request-URI HTTP-Version Header-field: Header-valueRequest-Body其中&#xff0c;GET 请求可以省略 Method 不写&#xff1b;HTTP-Version 可以省略不写&#xff0c;默认使用 1.1 版本。 示例&#xff1a; GET https://www.baidu.co…

Linux 文件系列:深入理解文件描述符fd,重定向,自定义shell当中重定向的模拟实现

Linux 文件系列:深入理解文件fd,重定向,自定义shell当中重定向的模拟实现 一.预备知识二.回顾C语言中常见的文件接口跟重定向建立联系1.fopen函数的介绍2.fclose函数的介绍3.代码演示1.以"w"(写)的方式打开2.跟输出重定向的联系3.以 "a"(追加)的方式打开4.…

Nginx正向代理域名的配置

目录 前言 1.打开文件 2. 启用代理 3. 指定代理服务器 4. 保存配置文件并重新加载Nginx。 5. 添加域名解析。 6. 配置客户端。 总结 前言 Nginx是一个高性能、开源的Web服务器软件&#xff0c;不仅可以作为反向代理服务器使用&#xff0c;还可以作为正向代理服务器使用…

Filter过滤器+JWT令牌实现登陆验证

一、背景 我们需要在客户端访问服务器的时候给定用户一定的操作权限&#xff0c;比如没有登陆时就不能进行其他操作。如果他需要进行其他操作&#xff0c;而在这之前他没有登陆过&#xff0c;服务端则需要将该请求拦截下来&#xff0c;这就需要用到过滤器&#xff0c;过滤器可以…

HNU-算法设计与分析-甘晴void学习感悟

前言 算法设计与分析&#xff0c;仅就课程而言&#xff0c;似乎是数据结构与算法分析的延续 教材使用&#xff1a; 课程 关于课程&#xff0c;橙学长讲的非常清晰&#xff0c;我深以为然。 HNUCS-大三课程概览-CSDN博客文章浏览阅读1.3k次&#xff0c;点赞5次&#xff0c;收…

开发Chrome扩展插件

1.首先开发谷歌chrome扩展插件&#xff0c;没有严格的项目结构目录&#xff0c;但是需要保证里面有一个mainfest.json文件 (必不可少的文件)。在这个文件里有三个属性必不可少&#xff1a;name、version、mainfest_version&#xff1b; // 清单文件的版本&#xff0c;这个必须写…

Linux学习之线程

目录 线程概念 1.什么是线程&#xff1f; 2.线程的优缺点 3.线程异常 4.线程用途 线程操作 1.如何给线程传参 2.线程终止 3.获取返回值 4.分离状态 5.退出线程 线程的用户级地址空间&#xff1a; 线程的局部存储 线程的同步与互斥 互斥量mutex 数据不一致的主要过…

Cluade3干货:超越GPT,模型特点分析+使用教程|2024年3月更新

就在刚刚&#xff0c;Claude 发布了最新的大模型 Claude3&#xff0c;并且一次性发布了三个模型&#xff0c;分别是 Claude 3 Haiku&#xff1a;&#xff08;日本俳句 &#xff09;Claude 3 Sonnet&#xff08;英文十四行诗&#xff09;Claude 3 Opus&#xff08;古典乐作品集…