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

news2024/11/18 12:39:10

目录

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.coloradmin.cn/o/1501151.html

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

相关文章

【NR技术】 3GPP支持无人机的关键技术以及场景

1 背景 人们对使用蜂窝连接来支持无人机系统(UAS)的兴趣浓厚&#xff0c;3GPP生态系统为UAS的运行提供了极好的好处。无处不在的覆盖范围、高可靠性和QoS、强大的安全性和无缝移动性是支持UAS指挥和控制功能的关键因素。与此同时&#xff0c;监管机构正在调查安全和性能标准以及…

讲讲 SaaS 平台的多租户设计

本篇就来讲讲 SaaS 平台的多租户设计。 以“钉钉”为例看实际的多租户场景 在讲设计之前&#xff0c;我们先以“钉钉”为例&#xff0c;来看看一个 SaaS 平台是如何运作的。相信大部分B 端产品经理都体验过钉钉&#xff0c;我们分两个维度来讲钉钉的租户注册到使用的流程。一…

mysql数据库(下)

目录 约束 约束的概念和分类 1、约束的概念&#xff1a; 2、约束的分类 1、主键约束 2、默认约束 3、非空约束 4、唯一约束 5、外键约束 约束 约束的概念和分类 1、约束的概念&#xff1a; 约束时作用于表中列上的规则&#xff0c;用于限制加入表的数据约束的存在保证…

代码随想录算法训练营第day40|343. 整数拆分 、 96.不同的二叉搜索树

a.343. 整数拆分 题目链接 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: …

csgo搬砖核心步骤,月入1000-10000你也可以的!

近年网络游戏产业的爆炸式增长&#xff0c;虚拟物品的交易需求也越来越大&#xff0c;为了满足虚拟物品的交易需求&#xff0c;网络游戏交易平台开始兴起和发展。网游交易平台的交易项目包括帐号交易、游戏币交易、装备交易这几种主要交易项目&#xff0c;其交易模式可分为C2C模…

FPGA IBUFG

IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接&#xff0c;与普通IO和其它内部CLB等没有物理连接。 所以&#xff0c;IBUFG输入的不能直接接另外信号。 GTH transceiver primitives are called GTHE3_COMMON and GTHE3_CHANNEL in UltraScale FPGAs, an…

大数据技术学习笔记(五)—— MapReduce(1)

目录 1 MapReduce 概述1.1 MapReduce 定义1.2 MapReduce 优缺点1.3 MapReduce 核心思想1.4 MapReduce 进程1.5 Hadoop 序列化类型1.6 MapReduce 编程规范1.7 WordCount 案例实操1.7.1 案例需求1.7.2 环境准备1.7.3 编写程序1.7.4 测试 2 MapReduce 序列化2.1 序列化概述2.2 自定…

2023最新群智能优化算法:巨型犰狳优化算法(Giant Armadillo Optimization,GAO)求解23个基准函数(提供MATLAB代码)

一、巨型犰狳优化算法 巨型犰狳优化算法&#xff08;Giant Armadillo Optimization&#xff0c;GAO&#xff09;由Omar Alsayyed等人于2023年提出&#xff0c;该算法模仿了巨型犰狳在野外的自然行为。GAO设计的基本灵感来自巨型犰狳向猎物位置移动和挖掘白蚁丘的狩猎策略。GAO…

2.4_1 死锁的概念

文章目录 2.4_1 死锁的概念&#xff08;一&#xff09;什么是死锁&#xff08;二&#xff09;死锁、饥饿、死循环的区别&#xff08;三&#xff09;死锁产生的必要条件&#xff08;四&#xff09;什么时候会发生死锁&#xff08;五&#xff09;死锁的处理策略 总结 2.4_1 死锁的…

Python笔记|基础算数运算+数字类型(1)

重新整理记录一下python的基础知识 基础运算符 、-、*、/ &#xff1b;括号 ()用来分组。 >>>2 2 4 >>>50 - 5*6 20 >>>(50 - 5*6) / 4 5.0 >>>8 / 5 1.6向下取整除法&#xff1a;向下舍入到最接近的整数的数学除法。运算符是 //。比如1…

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时&#xff0c;会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型&#xff0c;它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …

并发安全问题(超卖问题)

一&#xff0c;问题解析 超买问题就是&#xff0c;原本库存中有200件库存&#xff0c;结果由于并发问题售出了300件这就是炒卖问题对于买东西无非就是 查询商品&#xff0c;判断库存是否充足&#xff0c;如果充足则下单成功。 这里采用的是先查询&#xff0c;再判断&#xff0c…

谷歌广告(google Ads)投放技巧

Google广告投放涉及多个方面&#xff0c;以下是一些常用的技巧&#xff0c;可以帮助提高广告效果&#xff1a; 关键词选择&#xff1a; 选择与你的产品或服务紧密相关的关键词&#xff0c;并确保这些关键词与用户的搜索意图匹配。使用Google关键词规划工具来找到潜在的关键词&a…

C++泛型实现搜索二叉树

文章目录 二叉搜索树查找插入删除实现应用性能分析 二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;又称为二叉排序树&#xff0c;空树也算 二叉搜索树有如下性质 若左子树不为空&#xff0c;则左子树上所有节点值小于根节点若右子树不为空…

USB2.0设备检测过程信号分析

1.简介 USB设备接入的Hub端口负责检测USB2.0设备是否存在和确定USB2.0设备的速度。检测设备是否存在和确定设备速度涉及一系列的信号交互&#xff0c;下面将分析该过程。 2.硬件 USB低速设备和全速/高速设备的连接器在硬件结构上有所不同&#xff0c;而主机或者Hub接收端连接…

NTFS安全权限

NTFS是新技术文件系统&#xff08;New Technology File System&#xff09;的缩写&#xff0c;是一种用于Windows操作系统的文件系统。NTFS提供了高级的功能和性能&#xff0c;包括文件和目录的权限控制、加密、压缩以及日志等。它被广泛应用于Windows NT、Windows 2000、Windo…

基于SSM的大王门店管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SSM 3 1.1.1 Spring 3 1.1.2 Spring MVC 3 1.1.3 MyBatis 4 1.2 Shiro 4 1.3 前端技术 4 1.3.1 Bootstrap 4 1.3.2 jQuery 4 1.3.3 Ajax 5 1.3.4 Layui 5 1.3.5 Thymeleaf 5 1.4 本章小结 6 2 系统分析 7 2.1 功能需求分析…

云计算 3月8号 (wordpress的搭建)

项目wordpress 实验目的&#xff1a; 熟悉yum和编译安装操作 锻炼关联性思维&#xff0c;便于以后做项目 nginx 编译安装 1、安装源码包 [rootlinux-server ~]# yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel [rootlinux-server ~]# wget http://nginx.…

数据库 04-01 数据库的设计

01.设计的第一步&#xff0c;记录用户的信息 02.第二步概念转换成数据库概念 概念设计是什么&#xff1a; 着重点&#xff1a; 03.第三步完成增删改查的功能设计 04.最后的在数据库上实现

[HackMyVM]靶场 Zeug

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…