面试热题(全排列)

news2024/11/25 0:39:17

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

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

先在这里说明一下排列和组合的区别?

组合:是指从一个元素集合中选择出若干个元素,形成一个无序的子集,组合不考虑元素的顺序,只关注元素的选择

排列:是指从一个元素集合中选择出若干元素,形成一个有序的序列。排列关注元素的顺序。

简单的来说,就是排列是元素是有序的,组合是无序的

一般排列组合问题我们都可以看成是一棵树(每个元素不允许重复)           

因为我们这题要求的是不重复的排列数,所以我们的模板就可以套了(模板必须要记的——理解)

//不含重复元素的排列数
void backTrack(int[] nums){1
    for(int i=0;i<nums.length;i++){
        if(uesd[i])continue;
        used[i]=true;
        path.addLast(nums[i]);
        backTrack(nums);
        path.removeLast(nums[i]);
        used[i]=false;
    }

源代码如下:

    //存储结果集
    List<List<Integer>> list = new ArrayList<>();
    //路径
    Deque<Integer> path = new LinkedList<>();
    //是否被访问
    boolean[] visited = null;

    public List<List<Integer>> permute(int[] nums) {
        //对入参进行判断
        if (nums == null || nums.length == 0) {
            return list;
        }
        //对数组进行初始化
        visited=new boolean[nums.length];
        //开始递归,因为是排列,后面的元素也有可能在前面的元素前面,所以不需要传递索引
        backtracking(nums);
        //返回结果集
        return list;
    }

    private void backtracking(int[] nums) {
        //找到满足条件得到一种情况,存入结果集中
        if (path.size()== nums.length) {
            list.add(new ArrayList<>(path));
            return;
        }
        //遍历每一个元素
        for (int j = 0; j < nums.length; j++) {
            //如果被访问过,直接跳过,避免重复选择
            if(visited[j]){
                continue;
            }
            path.add(nums[j]);
            visited[j]=true;
            backtracking(nums);
            //回溯
            path.removeLast();
            visited[j]=false;
        }
}

在这里给大家提供我刷组合排列问题总结的模板:

组合子集问题每个元素的相对位置已经固定,所以每次去枚举的时候都是从自身的右侧开始枚举

排列问题的每个元素的相对位置是不固定的。左侧的元素可能会出现在右侧,故每次每次枚举都是从0位置上开始枚举的

  • 元素无重不可复选(nums中的元素唯一,每个元素最多只能被使用一次)

/*组合/子集问题回溯模板*/
/* [1,2,3]  */
void backTrack(int[] nums,int start){
    //顺序无关,每次从自身的右边开始
    for(int i=start;i<nums.length;i++){
        path.addLast(nums[i]);
        backTrack(nums,i+1);
        path.removeLast(nums[i]);
    }
}
/* 排列问题回溯模板*/
void backTrack(int[] nums){
     //顺序有关,每次从0开始
    for(int i=0;i<nums.length;i++){
        if(uesd[i])continue;
        used[i]=true;
        path.addLast(nums[i]);
        backTrack(nums);
        path.removeLast(nums[i]);
        used[i]=false;
    }
}
  • .元素可重不可复选(nums中的元素可以存在重复,每个元素最多只能被使用一次)

    Arrays.sort(nums);
    /* 组合/子集问题回溯算法框架 */
    void backtrack(int[] nums, int start) {
        // 回溯算法标准框架
        for (int i = start; i < nums.length; i++) {
            // 剪枝逻辑,跳过值相同的相邻树枝
            if (i > start && nums[i] == nums[i - 1]) {
                continue;
            }
            // 做选择
            track.addLast(nums[i]);
            // 注意参数
            backtrack(nums, i + 1);
            // 撤销选择
            track.removeLast();
        }
    }
    
    Arrays.sort(nums);
    /* 排列问题回溯算法框架 */
    void backtrack(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            // 剪枝逻辑
            if (used[i]) {
                continue;
            }
            // 剪枝逻辑,固定相同的元素在排列中的相对位置
            if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
                continue;
            }
            // 做选择
            used[i] = true;
            track.addLast(nums[i]);
    
            backtrack(nums);
            // 撤销选择
            track.removeLast();
            used[i] = false;
        }
    }
    

有很多人对上述剪枝操作不理解,看了这幅图你就会豁然开 

  • 元素无重可复选(nums中的元素都是唯一的,每个元素可以被使用若干次)

    /* 组合/子集问题回溯算法框架 */
    void backtrack(int[] nums, int start) {
        // 回溯算法标准框架
        for (int i = start; i < nums.length; i++) {
            // 做选择
            track.addLast(nums[i]);
            // 可以复选,所以i不用+1作为参数
            backtrack(nums, i);
            // 撤销选择
            track.removeLast();
        }
    }
    
    /* 排列问题回溯算法框架 */
    void backtrack(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            // 做选择
            track.addLast(nums[i]);
            backtrack(nums);
            // 撤销选择
            track.removeLast();
        }
    }

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

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

相关文章

[gdc]Rendering ‘God of War Ragnark‘

gdc23&#xff0c; sony santa monica关于god of war的分享&#xff1b; back ground 作者stephen mcauley现在是santa monica的technical director&#xff1b;20年加入santa monica&#xff0c;作为rendering lead&#xff0c;有9年的经验&#xff0c;之前在ubisoft montre…

[鹤城杯 2021]Middle magic 解题思路过程

过程 打开题目&#xff0c;是一道PHP的代码审计。代码如下&#xff1a; <?php highlight_file(__FILE__); include "./flag.php"; include "./result.php"; if(isset($_GET[aaa]) && strlen($_GET[aaa]) < 20){$aaa preg_replace(/^(.*)…

河道水位自动监测预警 yolov5

河道水位自动监测预警系统基于yolov5网络模型AI视频智能水尺读数技术&#xff0c;河道水位自动监测预警系统通过在河道周边布设监控摄像头&#xff0c;实时监测水位的变化&#xff0c;一旦水位超过预设阈值&#xff0c;将自动发出预警信号&#xff0c;并提示相关人员采取相应的…

计算机网络-物理层(一)物理层的概念与传输媒体

计算机网络-物理层&#xff08;一&#xff09;物理层的概念与传输媒体 物理层相关概念 物理层的作用用来解决在各种传输媒体上传输比特0和1的问题&#xff0c;进而为数据链路层提供透明(看不见)传输比特流的服务物理层为数据链路层屏蔽了各种传输媒体的差异&#xff0c;使数据…

Java 基础知识点

Object 类相关方法 getClass 获取当前运行时对象的 Class 对象。 hashCode 返回对象的 hash 码。 clone 拷贝当前对象&#xff0c; 必须实现 Cloneable 接口。浅拷贝对基本类型进行值拷贝&#xff0c;对引用类型拷贝引用&#xff1b;深拷贝对基本类型进行值拷贝&#xff0c;对…

CentOS7.7.1908升级python3版本

介绍 本文将详细介绍在CentOS7.7.1908系统的服务器将自带的python版本升级到3.8.0版本的过程。 在升级前CentOS7.7.1908中已经存在旧python版本。 查看CentOS版本命令&#xff1a; cat /etc/centos-release升级前后的python版本&#xff08;python3升级前为3.6.8&#xff09…

开箱报告,Simulink Toolbox库模块使用指南(三)——Simscape 电路仿真模块

文章目录 前言 Simscape 电路仿真模块 模型搭建 仿真求解 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;一&#xff09;——powergui模块》 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;二&#xf…

grafana中利用变量来添加dashboard详情页地址实现点击跳转

背景 最近弄grafana的dashboard,突然想到各个dashboard之前可以直接跳转到不同详细页面的面板,于是找了找实现方法 实现 以stat 格式的面板为例,显示出各个pod的对应状态, PromQL是(avg(kube_pod_status_phase{phase"Running", namespace!"kube-system"…

用友U8+CRM 任意文件上传+读取漏洞复现(HW0day)

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件&#xff0c;旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 getemaildata.php 文件存在任意文件上传和任意文件读取漏洞&#xff0c;攻击…

缓存 基础

在项目里面缓存是怎么用的? 项目中缓存是如何使用的&#xff1f;为什么要用缓存&#xff1f;缓存使用不当会造成什么后果? 这个问题&#xff0c;互联网公司必问&#xff0c;要是一个人连缓存都不太清楚&#xff0c;那确实比较尴尬。 只要问到缓存&#xff0c;上来第一个问题…

大数据课程I4——Kafka的零拷贝技术

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Kafka的零拷贝技术&#xff1b; ⚪ 了解常规的文件传输过程&#xff1b; 一、常规的网络传输原理 表面上一个很简单的网络文件输出的过程&#xff0c;在OS底层&…

leetcode 力扣刷题 滑动窗口 部分题解(记录)

力扣刷题 滑动窗口相关的部分题解 209. 长度最小的子数组904. 水果成篮76. 最小覆盖子串 209. 长度最小的子数组 leetcode题目链接 209.长度最小的子数组 题目内容是这样的&#xff1a;给定一个含有 n个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的…

不同路径 II——力扣63

class Solution {public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int n=

Java中处理表格

大家好 , 我是苏麟 , 也是很久没有更新了 , 今天带来一个很好使用的一个库 easyexcel. JAVA后端开发中可能会遇到一个问题 , 就是处理Execel表格 , 当然不一定非要用Java 我们在这里只说在Java里怎么去处理表格 . Easy Excel 我们今天要说到就是 Easy Excel , 这个是阿里的项…

学习笔记整理-JS-01-语法与变量

文章目录 一、语法与变量1. 初识JavaScript2. JavaScript的历史3. JavaScript与ECMAScript的关系4. JavaScript的体系5. JavaScript的语言风格和特性 二、语法1. JavaScript的书写位置2. 认识输出语句3. REPL环境&#xff0c;交互式解析器4. 变量是什么5. 重点内容 一、语法与变…

无涯教程-Perl - redo函数

描述 此函数将重新启动当前循环,而不会强制判断控制语句。块中不再执行任何语句。如果存在继续块,将不会执行。如果指定了LABEL,则在LABEL标识的循环开始时重新开始执行。 语法 以下是此函数的简单语法- redo LABELredo返回值 此函数不返回任何值。 例 以下是显示其基本…

J35复杂链表的复制

题目地址&#xff1a;复杂链表的复制_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 这里我们采用双指针的方法。 我们在创建节点的时候&#xff0c;可能当前节点创建了&#xff0c;但是当前节点的随机指针指向的节点还没创建&#xff0c;这种情况下&#xff…

【python】-【】

文章目录 转义字符和原字符二进制与字符编码标识符和保留字变量的定义和使用变量字符串列表for 一、print会输出①数字②字符串&#xff08;必须加引号&#xff09;③含有运算符的表达式&#xff08;例如 31 其中3&#xff0c;1是操作数&#xff0c;是运算符&#xff09;&#…

zabbix监控mysql数据库、nginx、Tomcat

文章目录 一.zabbix监控mysql数据库1.环境规划2.zabbix-server安装部署&#xff08;192.168.198.17&#xff09;3.zabbix-mysql安装部署&#xff08;192.168.198.15&#xff09;3.1 部署 zabbix 客户端3.2 服务端验证 zabbix-agent2 的连通性&#xff08;192.168.198.17&#x…

使用script标签解决跨域问题,但是只能使用get请求,且不需要获取get请求的数据,例如埋点,只需要触发后发送get请求,而不需要获取返回的参数

在项目中&#xff0c;使用埋点的时候&#xff0c;因为使用的是外部提供的接口&#xff0c;所以直接请求的时候&#xff0c;前端会报跨域的问题&#xff0c;本着不麻烦后端的想法&#xff0c;怎怎么前端实现跨域而完全不需要后段的配合&#xff0c;这时候就想到了通过script标签…