DFS与回溯专题:全排列

news2025/1/12 20:39:04

    DFS与回溯专题:全排列

题目链接: 46.全排列

题目描述

在这里插入图片描述

代码思路

回溯问题中的全排列,相对比组合、子集等问题,其元素可以颠倒顺序,所以在for循环中每层都是从头开始,无需标记更新起始位置

代码纯享版

class Solution {

    public List<List<Integer>> list_all = new ArrayList();
    public List<Integer> list = new ArrayList();
    public int[] res;

    public List<List<Integer>> permute(int[] nums) {
        res = new int[nums.length];
        backtrack(nums);
        return list_all;
    }

    void backtrack(int[] nums){

        if(list.size() == nums.length){
            list_all.add(new ArrayList(list));
        }

        for(int i = 0; i < nums.length; i++){
            if(res[i] == 1){
                continue;
            }
            list.add(nums[i]);
            res[i] = 1;
            backtrack(nums);
            res[i] = 0;
            list.remove(list.size() - 1);
        }
    }
}

代码逐行解析版

class Solution {

    public List<List<Integer>> list_all = new ArrayList();
    public List<Integer> list = new ArrayList();
    public int[] res;

    public List<List<Integer>> permute(int[] nums) {
        res = new int[nums.length]; //数组res用来判断对应位置的数是否用过:0为没用,1为用过
        backtrack(nums);
        return list_all;
    }

    void backtrack(int[] nums){

        if(list.size() == nums.length){ //当列表list的长度与数组nums长度相同时,说明已经完成一次全排列
            list_all.add(new ArrayList(list)); //将list添加到list_all
        }

        for(int i = 0; i < nums.length; i++){
            if(res[i] == 1){ //如果该数字已使用过,则直接退出本次循环
                continue;
            }
            list.add(nums[i]); //否则将该数字添加到list列表中
            res[i] = 1; //将该数字标记为已使用过
            backtrack(nums); //递归到下一个位置的排列
            //将列表list的最后一个数字去掉,同时还原标记
            res[i] = 0; 
            list.remove(list.size() - 1);
        }
    }
}

其他解法

也可以利用list.contains()方法来判断是否被使用,但这种方式会耗费较多时间。所以最好用前面的方法,已空间换时间

class Solution {

    public List<List<Integer>> list_all = new ArrayList();
    public List<Integer> list = new ArrayList();

    public List<List<Integer>> permute(int[] nums) {
        backtrack(nums);
        return list_all;
    }

    void backtrack(int[] nums){

        if(list.size() == nums.length){
            list_all.add(new ArrayList(list));
        }

        for(int i = 0; i < nums.length; i++){
            if(list.contains(nums[i])){
                continue;
            }
            list.add(nums[i]);
            backtrack(nums);
            list.remove(list.size() - 1);
        }
    }
}

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

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

相关文章

应用层协议 -- HTTPS 协议

目录 一、了解 HTTPS 协议 1、升级版的 HTTP 协议 2、理解“加密” 二、对称加密 1、理解对称加密 2、对称加密存在的问题 三、非对称加密 1、理解非对称加密 2、中间人攻击 3、CA 证书和数字签名 四、总结 一、了解 HTTPS 协议 1、升级版的 HTTP 协议 HTTPS 也是…

蜂窝物联:智慧水产养殖系统绘制“水世界”画卷

智慧水产养殖系统&#xff0c;融合了智能传感、无线传感网、通信、智能处理与智能控制等物联网技术的精髓&#xff0c;为养殖者绘制了一幅细致入微的“水世界”画卷。通过在线监测平台与各类智能传感器的协同作战&#xff0c;养殖者能够实时掌握养殖水质环境信息&#xff0c;仿…

AOC vs. DAC:哪个更适合您的网络需求?

在现代网络通信中&#xff0c;选择合适的连接线缆对于数据传输的稳定性和速度至关重要。两种常见的线缆类型是 AOC&#xff08;Active Optical Cable&#xff09; 和 DAC&#xff08;Direct Attach Cable&#xff09;。本文将详细介绍这两种线缆的特点、优势和适用场景&#xf…

ubuntu安装Qv2ray2.7.0及配置

需要下载两个文件&#xff0c;一个是zip文件&#xff0c;一个是AppImage执行程序。 执行AppImage需要先下在fuse sudo apt install libfuse2然后为AppImage赋予执行权限 sudo chmod x ./Qv2ray-v2.7.0-linux-x64.AppImage执行,执行前可以解压zip文件 ./Qv2ray-refs.tags.v1…

vue3环境搭建

环境准备&#xff1a; node环境(node.js官网)npm环境 上述两个环境存在版本要求所以安装最新的靠谱&#xff08;旧的环境存在不支持现象&#xff09; windows电脑 安装完node.js会带有npm mac电脑本身自带node和npm&#xff0c;但是需要升级 进入到你想创建前端项目的文件夹:…

如何删除.git

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

CUDA的开发框架

CUDA的开发框架主要提供了一系列工具和库&#xff0c;使得开发者可以充分利用NVIDIA GPU进行高效的并行计算。以下是CUDA开发框架的一些关键组成部分。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.CUDA核心库&#xff1a;这些是构…

万里牛ERP集成金蝶云星空(金蝶云星空主管供应链)

源系统成集云目标系统 金蝶云星空介绍 金蝶云星空是金蝶软件&#xff08;中国&#xff09;有限公司研发的新一代战略性企业管理软件&#xff0c;致力于为企业提供端到端的供应链整体解决方案&#xff0c;它可以帮助企业构建敏捷供应链体系&#xff0c;降低供应链成本…

BBEdit for Mac v15.0.3激活版 支持多种类型的代码编辑器

BBEdit包含了很多一流的功能&#xff0c;包括GREP图样匹配&#xff0c;搜索和替换多个文件&#xff08;即使未开启的远程服务器上的文件&#xff09;&#xff0c;项目定义的工具&#xff0c;功能导航和众多的源代码语言的语法着色&#xff0c;代码折叠&#xff0c;FTP和SFTP打开…

《统计学习方法》 第4章 朴素贝叶斯法

文章目录 前言一、朴素贝叶斯法二、朴素贝叶斯法的学习和分类三、朴素贝叶斯算法四、贝叶斯估计总结 前言 本文只要记录一些书中的一些小知识点&#xff0c;挑一些本人认为重要的地方进行总结。 各位道友&#xff01;道长(zhǎng) 道长(chǎng) 一、朴素贝叶斯法 朴素贝叶斯…

YashanDB V23.2 LTS发版 | 共享集群首个长期支持版本

4月&#xff0c;YashanDB正式发布长期支持版本YashanDB V23.2 LTS&#xff0c;标志着YashanDB单机主备、共享集群和分布式实时数仓等完整产品体系&#xff0c;已全面进入可规模化使用的长期支持阶段&#xff1b;同时配套数据迁移工具、监控运维工具和开发者工具&#xff0c;可以…

2024/04/25

1.课上练习 2.思维导图

使用Docker搭建Redis主从集群

文章目录 ☃️前言☃️搭建❄️❄️架构❄️❄️实例说明❄️❄️搭建第一个服务器上的两个实例❄️❄️搭建第二个服务器上的一个实例 ☃️开启主从❄️❄️改配置❄️❄️重启从节点 ☃️验证 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 …

常用的锁和死锁以及避免死锁

走近锁的世界 什么是锁常用的锁互斥量基本用法 无锁 CAS 死锁和避免死锁死锁避免死锁 什么是锁 在并发编程中&#xff0c;为了保护多线程同时访问的共享数据&#xff0c;以及避免出现意向不到的结果&#xff0c;锁&#xff08;应运而生&#xff09;  简单讲下为什么数据结果有…

SQL获取最后一次的数据

问题 有个表格(id,machineName,value,updatetime)&#xff0c;里面比如有10个机台&#xff0c;里面记录了这10个机台的几十万条数据 如何获取每个机台的最后一笔数据&#xff1f; machines表 解决办法 1.首先获得每个机台最后的更新时间 select machineName,max(updatetim…

常见的工业路由器访问问题

A&#xff1a;工业路由器已经设置了pptp怎么访问路由下面的电脑 1. 确认PPTP VPN设置&#xff1a;首先&#xff0c;确保PPTP VPN服务器在工业路由器上已正确设置&#xff0c;并且处于活动状态。这包括确保VPN服务器的IP地址、端口、用户名和密码等设置正确无误。 2. 连接到VP…

【各大网站独家代理】腾讯应用宝腾讯王者荣耀残棋方式拉新生态,轻轻松松日如1000

全新生态项目独家首发&#xff0c;自4月15日起全面启动&#xff01;现在正是时候加入&#xff0c;抢占蓝海市场&#xff0c;赚取第一桶金&#xff01; 下载 地 址 &#xff1a; laoa1.cn/1789.html 腾讯王者荣耀残局挑战拉新项目&#xff1a; 引流成本为8元/单&#xff0c;…

static和extern关键字详解

目录 创作不易&#xff0c;如对您有帮助&#xff0c;还望一键三连&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 回顾 1.作用域和声明周期 1.1作用域 1.2生命周期 2.static和extern 2.1extern 2.2static 2.2-1static修饰局部变量 2.2-2static修饰全局变量 创…

k8s使用calico网络插件时,集群内节点防火墙策略配置方法

前言 我们在内网使用k8s时&#xff0c;有时候需要针对整个集群的节点设置防火墙&#xff0c;阻止一些外部访问&#xff0c;或者是仅允许白名单内的ip访问&#xff0c;传统做法是使用firewall之类的防火墙软件&#xff0c;但是&#xff0c;使用firewall存在如下问题&#xff1a…

资料总结分享:数据库:1.设计概念

目录 1 数据库设计任务 3 数据库设计方法 4 数据库设计的基本步骤 4.1 需求分析阶段 4.2 概念结构设计阶段 4.3 逻辑结构设计阶段 4.4 物理结构设计 4.5 数据库的实施阶段 4.6 数据库的运行和维护阶段 5 数据库结构设计阶段 6 数据库设计与模式结构 根据一个单位的信…