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

目录

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.mzph.cn/news/730895.shtml

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

相关文章

蓝桥杯每日一题:烤鸡dfs

这道题考察了dfs的应用&#xff0c;题干十分有趣&#xff0c;思考过程对以后类似题目也有很强的参考性&#xff0c;一起来学习吧&#xff01; 题目&#xff1a; # 烤鸡 ## 题目背景 猪猪 Hanke 得到了一只鸡。 ## 题目描述 猪猪 Hanke 特别喜欢吃烤鸡&#xff08;本是同畜…

蓝桥杯练习题——归并排序

1.火柴排队 思路 1.求最小值的时候&#xff0c;可以直接按升序排序&#xff0c;这样得到的值就是最小值 2.求最小交换次数的时候&#xff0c;不能直接排序&#xff0c;因为只能交换相邻的数&#xff0c;只需要知道他们的相对大小&#xff0c;所以可以先用离散化&#xff0c;把…

清华大学1748页CTF竞赛入门指南,完整版开放下载!

CTF是一种针对信息安全领域的经济性挑战&#xff0c;旨在通过解决一系列的难题来寻找隐藏的“flag”。CTF比赛战队一般是以高校、科研单位、企业、信息安全从业者或社会团体组成。对于网安爱好者及从业者来说&#xff0c;拥有“CTF参赛经验”也是求职中的加分项。 前几天分享的…

什么是智慧公厕?智慧公厕设备有哪些

在现代社会&#xff0c;公共厕所作为城市基础设施的重要一环&#xff0c;承载着城市卫生、居民生活品质的重要责任。然而&#xff0c;传统公厕存在的问题仍然不可忽视&#xff1a;脏乱差、资源浪费、安全隐患等等。 为了解决这些问题&#xff0c;针对公共厕所日常使用、运营管…

六、长短时记忆网络语言模型(LSTM)

为了解决深度神经网络中的梯度消失问题&#xff0c;提出了一种特殊的RNN模型——长短期记忆网络&#xff08;Long Short-Term Memory networks, LSTM&#xff09;&#xff0c;能够有效的传递和表达长时间序列中的信息并且不会导致长时间前的有用信息被忽略。 长短时记忆网络原理…

ORA/GSA -- 学习记录

brief over-representation analysis(ORA),过表“达”分析&#xff0c;就是我们做多分组的RNAseq数据解析后会得到一些差异表达的gene&#xff0c;有些时候是单独拿出一个差异gene去解释表型&#xff0c;缺点是欠缺证据力度。有些人就把一些相关的差异gene放在一块儿解释&…

网络编程---网络编程入门、UDP通信程序、TCP通信程序

1.网络编程入门 1.网络编程概述 网络编程&#xff1a; 在网络通信协议下&#xff0c;实现网络互连的不同计算机上运行的程序间可以进行数据传输 计算机网络&#xff1a; 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#…

J1周-ResNet-50算法

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Tensorflow/Pytorch 1.8.0cu111 一、问题引出 CNN能够提取低、中、…

qnx启动中控屏黑屏

bmetrics_service boot metrics service, 用于记录统计启动性能信息,读取/dev/bmetrics可以获取到这些信息 # use memorydump memorydump Sets the debug cookies, copies MMU info into reset_info asinfo, sets the secure monitor(TZ) dump buffer, starts tracelogger Usa…

VR全景技术在VR看房中有哪些应用,能带来哪些好处

引言&#xff1a; 随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术在房地产行业中的应用也越来越广泛。其中&#xff0c;VR全景技术在VR看房中的运用尤为突出。今天&#xff0c;让我们一起深入探讨VR全景技术在VR看房中的应用及其带来的种种好处。 一、…

ES入门二:文档的基本操作

索引管理 创建索引 删除索引 文档管理 创建文档 如果有更新需求&#xff0c;使用第一种如果有唯一性校验&#xff0c;使用第二种如果需要系统给你创建文档Id&#xff0c;使用第三种 &#xff08;这个性能更好&#xff09; 相比第一种&#xff0c;第三种的写入效率更高&#xf…

基础GamePlay知识-碰撞检测

将会持续更新gameplay的一些基础知识&#xff0c;一同学习。 扇形检测 扇形检测是Gameplay里面很常见的场景。比如荒野乱斗中&#xff0c;大部分的近战角色都是扇形攻击。在扇形范围内就认为是受击。 扇形检测只有两个参数&#xff0c;一个是扇形的角度一个是扇形的半径大小。…

直播预告|小白开箱: 云数据库在五朵云上的评测

3 月 7 日&#xff0c;周四晚上 19:00-20:30 由明说三人行组织&#xff0c;邀请了 NineData 国际总经理(GM) Ni Demai、云猿生数据 CTO &#xff06; 联合创始人子嘉&#xff0c;和《明说三人行》创始人 &主持人明叔&#xff0c;共同围绕《小白开箱: 云数据库在五朵云上的评…

官网正在被哪些产品蚕食,定制网站又被哪些建站产品挤占。

2023-12-09 16:22贝格前端工场 官网建设是一个被大多数人看衰的市场&#xff0c;本文来理性分析下&#xff0c;谁在蚕食这个市场&#xff0c;谁又在挤占这个产品生存空间&#xff0c;欢迎大家评论&#xff0c;探讨。 网站正在被以下产品形式取代&#xff1a; 1. 移动应用&…

揭秘Web缓存:提升网站性能与用户体验

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

金融数据采集与风险管理:Open-Spider工具的应用与实践

一、项目介绍 在当今快速发展的金融行业中&#xff0c;新的金融产品和服务层出不穷&#xff0c;为银行业务带来了巨大的机遇和挑战。为了帮助银行员工更好地应对这些挑战&#xff0c;我们曾成功实施了一个创新的项目&#xff0c;该项目采用了先进的爬虫技术&#xff0c;通过ope…

七彩虹@电脑cpu频率上不去问题@控制中心性能模式cpu频率上不去@代理服务器超时@账户同步设置失败

文章目录 windows电脑cpu频率上不去新电脑的系统时间问题系统时间不准造成的具体问题举例代理超时vscode同步请求失败自动校准时间 windows电脑cpu频率上不去 问题描述,标压处理器的笔记本,cpu频率上不去 如果cpu没问题的话,就应该是系统限制了功耗导致的有的笔记本有控制中心…

动手学深度学习PyTorch版

基本的数据操作 import torch # 创建一个行向量&#xff0c;默认为从0开始的12个整数 # n维数组也称为张量 x torch.arange(12) x # 张量的形状 x.shape# 张量的大小,张量所有元素的个数 x.numel()#修改张量的形状 x x.reshape(3,4)#生成形状为3*4的两个向量&#xff0c;向…

深度学习与人类的智能交互:迈向自然与高效的人机新纪元

引言 随着科技的飞速发展&#xff0c;深度学习作为人工智能领域的一颗璀璨明珠&#xff0c;正日益展现出其在模拟人类认知和感知过程中的强大能力。本文旨在探讨深度学习如何日益逼近人类智能的边界&#xff0c;并通过模拟人类的感知系统&#xff0c;使机器能更深入地理解和解…

20240308-1-校招前端面试常见问题CSS

校招前端面试常见问题【3】——CSS 1、盒模型 Q&#xff1a;请简述一下 CSS 盒模型&#xff1f; W3C 模式&#xff1a;盒子宽widthpaddingbordermargin 怪异模式&#xff1a;盒子宽widthmargin Q&#xff1a;inline、block、inline-block 元素的区别&#xff1f; inline&am…