递归|全排列

全排列一

题目描述

396b208af9768.png)

算法原理

  • 我们先把决策树画出来,根据决策树写代码,然后设计函数头

  • dfs函数用途就是从nums数组选数填入横线
    在这里插入图片描述
    就是有三个位置,我们把1 2 3填进这三个位置,而且保证不重复。
    比如我们第一冷选了1之后第二轮就不能选1了,打个红色的×。

  • 我们人的智慧一眼就知道前面选了1之后就不能选1了但是机器要怎么实现这一点呢?我们可以通过一个visited 数组实现这一点。

  • 如我们把visted数组全设为false 当 添加一个之后再设置为true

  • 我们还需要 path这个vector数组用来保存遍历的路径,ret 数组用来保证path每次遍历的结果

class Solution {
public:vector<int>path;vector<vector<int>>ret;int visted[7];void dfs(vector<int>& nums){if (path.size() == nums.size()){ret.push_back(path);return;}for (int i = 0; i < nums.size(); i++){if (visted[i] != true){path.push_back(nums[i]);visted[i] = true; dfs(nums);visted[i] = false;path.pop_back(); }// else// {//     return ;// }}}vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}
};

魔鬼细节一:dfs(nums)后面的内容可以写在if外吗?

比如说下面这样

class Solution {
public:vector<int>path;vector<vector<int>>ret;int visted[7];void dfs(vector<int>& nums){if (path.size() == nums.size()){ret.push_back(path);return;}for (int i = 0; i < nums.size(); i++){if (visted[i] != true){path.push_back(nums[i]);visted[i] = true; }dfs(nums);visted[i] = false;path.pop_back(); }}vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}
};

不可以因为这样会死递归
我们第二层还是从1开始的,1已经被遍历过了不会被if击中,就走下一层,下一次也是从1开始的,又走下一层。所以会死递归
在这里插入图片描述
从逻辑上解释只有我们上一层选择了一个数,下一层才开始选数

魔鬼细节二:我们剪枝的时候 可以用return吗?

比如下面这样

class Solution {
public:vector<int>path;vector<vector<int>>ret;int visted[7];void dfs(vector<int>& nums){if (path.size() == nums.size()){ret.push_back(path);return;}for (int i = 0; i < nums.size(); i++){if (visted[i] != true){path.push_back(nums[i]);visted[i] = true; dfs(nums);visted[i] = false;path.pop_back(); }else{return ;}}}vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}
};

不可以,从代码执行的角度:我们从第二层返回到一层时,没有把所用情况遍历完,就把visted【i】,path恢复了。从逻辑上是希望第一层,最到最后一层才返回,而不是第二层有不符合条件的就返回第一层
#全排列二

题目描述

这道题和上一题唯一的区别就时nums数组元素可以重复了
比如 【1,1,2】 情况就没有 6种了
在这里插入图片描述

算法原理:

  • 和第一题差不多只是剪枝不一样
  • 当第一数选择 1 剩下 的数 112 和从第二位数选择1 剩下的数选择112 情况是一样的。
  • 下图蓝色的×表示 同一层相同两个数一样时应该跳过
  • 紫色的×表示一个数不能重复的选
    在这里插入图片描述

代码实现

class Solution {
public:vector<int> path;vector<vector<int>> ret;int visted[20];void dfs(vector<int>&nums){if(path.size() == nums.size()){ret.push_back(path); return ;}for(int i = 0; i < nums.size(); i++){if(visted[i] == false && ( i == 0|| nums[i] != nums[i-1]  || visted[i-1] == true)){path.push_back(nums[i]);visted[i] = true;dfs(nums);path.pop_back();visted[i] = false;}}}vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(nums);return ret;}};

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

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

相关文章

Redis(性能管理、主从复制、哨兵模式)概述及部署

目录 一、性能管理 1、查看Redis内存使用 2、内存碎片率 3、跟踪内存碎片率 4、内存使用率 5、内回收key 二、Redis集群有三种模式 三、Redis主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、搭建Redis主从复制 1.环境准备 2.安装Redis&#…

【学习分享】小白写算法之选择排序篇

【学习分享】小白写算法之选择排序篇 前言一、什么是选择排序算法二、选择排序算法如何实现三、C语言实现算法四、复杂度计算五、算法稳定性六、小结 前言 简单排序有三种&#xff0c;冒泡排序&#xff0c;插入排序和选择排序。这三种排序的算法算是入门级别的&#xff0c;打好…

联想 Y9000P 连接网线速度慢 的 问题解决

参考帖子&#xff1a;求助&#xff0c;拯救者Y9000P 2022 i73060版本 有线网非常慢 无线网正常【笔记本吧】_百度贴吧 问题原因&#xff1a; 网卡驱动版本不对。不能用Win11版&#xff0c;要用Win10版。 问题解决&#xff1a; 1、卸载原驱动 2、下载Win10 驱动 并安装 下载…

JavaEE 初阶篇-生产者与消费者模型(线程通信)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 生产者与消费者模型概述 2.0 在生产者与消费者模型中涉及的关键概念 2.1 缓冲区 2.2 生产者 2.3 消费者 2.4 同步机制 2.5 线程间通信 3.0 实现生产者与消费者模…

SpringBoot+ECharts+Html 字符云/词云案例详解

1. 技术点 SpringBoot、MyBatis、thymeleaf、MySQL、ECharts 等 2. 准备条件 在mysql中创建数据库echartsdb&#xff0c;数据库中创建表t_comment表&#xff0c;表中设置两个字段word与count&#xff0c;添加表中的数据。如&#xff1a;附件中的 echartsdb.sql 3. SpringBoot…

如何选择和注册域名,域名有什么作用,什么是域名解析?域名的需要多少钱?

大家好欢迎来到易极赞&#xff0c;今天我们来跟大家聊一下“如何选择和注册域名”这个话题。 域名用来做什么&#xff1f; 域名对您的网站至关重要&#xff0c;因为它代表您的品牌名称并充当网站的地址。对于企业主来说&#xff0c;一个令人难忘的域名有助于建立在线形象和客户…

使用神经网络-遗传算法优化神经网络-风电预测故障(BP,GABP,matlab)

本项目是故障预测&#xff0c;不是时序预测&#xff0c;本质还是分类问题 1 数据集介绍 特征文件&#xff1a; 标签文件&#xff1a;共计4个标签&#xff0c;其中大多数都是正常的&#xff0c;其他是3个不正常的类别 2 使用BP网络 2.1 读取数据&#xff0c;然后选择几个…

git可视化工具

Gitkraken GitKraken 是一款专门用于管理和协作Git仓库的图形化界面工具。它拥有友好直观的界面&#xff0c;使得Git的操作变得更加简单易用&#xff0c;尤其适合那些不熟悉Git命令行的开发者。GitKraken提供了丰富的功能&#xff0c;如代码审查、分支管理、仓库克隆、提交、推…

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a; 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

【PyQt5篇】多线程

文章目录 &#x1f354;使用QtDesigner进行设计&#x1f6f8;实现多线程&#x1f339;效果&#x1f50e;原因 &#x1f354;使用QtDesigner进行设计 对应的代码btn.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0">&l…

java——文件上传

一、文件上传——简介 文件上传的简介&#xff1a;文件上传是指将本地计算机中的文件传输到网络上的服务器或另一台计算机上的过程。在 Web 开发中&#xff0c;文件上传通常指的是将用户通过 Web 页面提交的文件&#xff08;如图像、文档、音频、视频等&#xff09;传输到服务器…

C和C++内存管理

目录&#xff1a; 一&#xff1a;C和C内存分布 二&#xff1a;C动态内存管理方式 三&#xff1a;C动态内存管理方式 四&#xff1a;operator new与operator delete函数 五&#xff1a;new和delete的实现原理 六&#xff1a;定位new表达式(placement-new) 七&#xff1…