面试热题(全排列)

        给定一个不含重复数字的整数数组 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){1for(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.hqwc.cn/news/68165.html

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

相关文章

opencv+ffmpeg+QOpenGLWidget开发的音视频播放器demo

前言 本篇文档的demo包含了 1.使用OpenCV对图像进行处理&#xff0c;对图像进行置灰&#xff0c;旋转&#xff0c;抠图&#xff0c;高斯模糊&#xff0c;中值滤波&#xff0c;部分区域清除置黑&#xff0c;背景移除&#xff0c;边缘检测等操作&#xff1b;2.单纯使用opencv播放…

旧版本docker未及时更新,导致更新/etc/docker/daemon.json配置文件出现docker重启失败

一、背景 安装完docker和containerd之后&#xff0c;尝试重启docker的时候&#xff0c;报错如下&#xff1a; systemctl restart dockerJob for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “…

面试热题(缺失的第一个正数)

给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 尝试的路途是痛苦的&#xff0c;不断的尝试新方法&#xff0c;错何尝…

Termux SFTP 进行远程文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

IOS开发-XCode14介绍与入门

IOS开发-XCode14介绍与入门 1. XCODE14的小吐槽2. XCODE的功能bar一览3. XCODE项目配置一览4. XCODE更改DEBUG/RELEASE模式5. XCODE单元测试 1. XCODE14的小吐槽 iOS开发工具一直有个毛病&#xff0c;就是新版本的开发工具的总会有一些奇奇怪怪的bug。比如在我的Mac-Pro&#…

redis的三种集群方式

redis有三种集群方式&#xff1a;主从复制&#xff0c;哨兵模式和集群。 1.主从复制 主从复制原理&#xff1a; 从服务器连接主服务器&#xff0c;发送SYNC命令&#xff1b; 主服务器接收到SYNC命名后&#xff0c;开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所…

确定产品需求边界需重点关注4个方面

产品需求需要确定边界&#xff0c;因为资源的是有限的。而没有边界的需求&#xff0c;会造成项目目标混乱&#xff0c;工期的延长&#xff0c;开发成本增加等问题。 1、定义最小业务单元 一般来说&#xff0c;产品不可能做大而全&#xff0c;需有自己专属的业务市场。从用户角度…

【数据结构】二叉树篇|超清晰图解和详解:二叉树的最近公共祖先

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 你不能要求一片海洋&#xff0c;没有风暴&#xff0c;那不是海洋&#xff0c;是泥塘——毕淑敏 目录 一、题目二、题解三、代码 一、题目 …

升级iPhone 15 Pro Max还是等待下一代?看看我们的比较分析!

对于拥有13 Pro Max并即将结束两年合同的用户,或者任何想看看是否值得购买两年前非常好的旗舰iPhone的最新机型的人来说,分解iPhone 15 Pro Max与iPhone 13 Pro Max的差异非常重要。无论你的动机是什么,我们都会帮助你找到答案。 iPhone 15 Pro Max还没有发布,但很快我们就…

计算文本相似度

目录 Python中的difflib模块模块用法报告涉及的符号实现文本对比普通文本对比文本对比生成HTML报告 余弦相似度sklearn安装使用sklearn的余弦相似度词袋模型 Jaccard相似度编辑距离&#xff08;Levenshtein距离&#xff09;TF-IDFWord2VecDoc2VecBERT结论 Python中的difflib模块…

kriging-contour前端克里金插值

先看效果&#xff1a; 本项目在kriging-contour插件基础上进行了封装&#xff0c;增加了自定义区域插值&#xff0c;gitbub地址。

pycharm中配置conda

安装好pycharm和conda后&#xff0c;打开pycharm&#xff1a;