LeetCode刷题--- 全排列

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

力扣递归算法题       【  http://t.csdnimg.cn/yUl2I   】
【C++】                  【  http://t.csdnimg.cn/6AbpV 】
数据结构与算法       【  http://t.csdnimg.cn/hKh2l  】


前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


 全排列

题目链接:全排列

 题目

给定一个不含重复数字的数组 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 中的所有整数 互不相同

解法

题目解析

题目意思很简单,给我们一个数组,返回其 所有可能的全排列 

例如

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

输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]


算法原理思路讲解    

典型的回溯题⽬,我们需要在每⼀个位置上考虑所有的可能情况并且不能出现重复。通过深度优先搜索的⽅式,不断地枚举每个数在当前位置的可能性,并回溯到上⼀个状态,直到枚举完所有可能性,得到正确的结果。每个数是否可以放⼊当前位置,只需要判断这个数在之前是否出现即可
我们在做这类题目的时候,大概可以分为三个步骤
  1. 画出决策树(越详细越好)
  2. 设计代码
    1. 设计全局变量
    2. 设计递归函数
  3. 细节问题:回溯、剪枝、递归出口等问题(但是不是每个题都要)

 大家现在不懂也没关系,后面我会举例子,大家先知道有这三个步骤


一、画出决策树

决策树大概可以画成这样,首先在在 1,2,3 中选出一个,再继续向下选择

决策树就是我们后面设计函数的思路


二、设计代码

(1)全局变量

根据决策树的思路,首先我们要有一个二维数组存放排列的数(ret),我们还需要一个路径变量(path)用来存放每个被选出来的数,最后我们还需要一个变量(check)用来判断这个数是否被选过了。


vector<vector<int>> ret;
vector<int> path;
bool check[10] = { false };

(2)设计递归函数


void dfs(vector<int>& nums);

三、细节问题:回溯、剪枝、递归出口 

回溯:我们只用再递归后,把 path 中数字删除,并在 check 中恢复成未被使用即可

递归出口 :我们只用判断 path.size() == nums.size() ,如果相等,将 path 存入 ret 后,返回即可

现在思路就讲完了,大家可以自己做一做了


代码实现

  • 时间复杂度:O(n×n!),其中 n 为序列的长度
  • 空间复杂度:O(n),其中 n 为序列的长度。除答案数组以外,递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,这里可知递归调用深度为 O(n)
class Solution 
{
public:vector<vector<int>> ret;vector<int> path;bool check[10] = { false };void dfs(vector<int>& nums){if (path.size() == nums.size()){ret.push_back(path);return;}for (int i = 0; i < nums.size(); i++){if (!check[i]){check[i] = true;path.push_back(nums[i]);dfs(nums);path.pop_back();   // 回溯check[i] = false;  // 回溯}}}vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}
};

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

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

相关文章

UE5 PlaceActor

⚠️ 重点 PlaceActors 需在引擎初始化之后 但&#xff0c;单为这一个功能&#xff0c;更改整个模块的启动顺序&#xff0c;也不太划算 更好的办法是&#xff0c;启动顺序保持正常&#xff08;如"LoadingPhase": "Default" &#xff09;&#xff0c;然后…

openEuler商业化进展可观:累计装机量超610万套,市场持续扩容

12月15日至16日&#xff0c;以“崛起数字时代&#xff0c;引领数智未来”为主题的操作系统大会&#xff06;openEuler Summit 2023在北京国家会议中心举办。大会旨在汇聚全球产业界创新力量&#xff0c;构筑坚实的基础软件根基&#xff0c;推动基础软件技术持续创新&#xff0c…

喝葡萄酒时观酒闻香尝味究竟有什么用?

对许多人来说&#xff0c;在品尝葡萄酒时能发现大多数人闻不到的香气和尝不到的味道似乎是一种神奇的能力。其他人则认为这是学究式葡萄酒爱好者过于活跃的想象&#xff0c;或者是保持葡萄酒鉴赏精英声誉的一种方式&#xff0c;但两者都不是。 部分是艺术&#xff0c;部分是科…

巨杉数据库入选“2023信创独角兽企业100强”

近日&#xff0c;《互联网周刊》、eNet研究院、德本咨询联合发布了“2023信创独角兽企业100强”榜单&#xff0c;巨杉数据库凭借卓越的技术实力和出色的研发能力荣登榜单&#xff0c;本次上榜既是对巨杉数据库长期深耕信创领域的高度认可&#xff0c;也是对其在分布式文档型数据…

【问题解决】Buildroot文件系统dropbear 上位机scp命令Permission denied, please try again.

前提&#xff1a; 上位机&#xff1a;Ubuntu虚拟机与开发板同局域网开发板&#xff1a;Buildroot文件系统&#xff0c;开启了dropbear&#xff0c;已经联网与虚拟机同局域网 liefyuanubuntu:~/tcp-test/tcp-c-client$ scp tcp_client root192.168.8.199:/opt root192.168.8.1…

break用法

break他是用于从循环语句中跳出一层循环体的&#xff0c;提前结束循环 但是值得注意的点事break只能用在循环语句和switch当中 那么我们上代码进行具体的理解&#xff1a; 如果圆的面积大于100就会终止循环&#xff0c;那么如何体现出他只能终结一个循环呢&#xff0c;请看下…

软考、PMP 区别

软考 考试时间&#xff1a;一年两次&#xff0c;报名3月&#xff0c;8月&#xff1b;对应考试&#xff1a;5月最后一个周末&#xff0c;11月第一个周末 报名费&#xff1a;50-200元&#xff0c;每个城市不同北京57每科 报名网站&#xff1a;中国计算机技术职业资格网 考试等…

基于SSM的中文学习系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的中文学习系统(有报告)。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatis JspMave…

Dagger2基本使用3之其他使用

一&#xff0c;Dagger容器中添加不是Dagger创建的实力对象 在实际使用中&#xff0c;有些类的已经创建好了&#xff0c;dagger需要使用这些类&#xff0c;就需要通过参数传入&#xff0c;下面是android中传入application实例的一个例子 1&#xff0c;创建module //创建需要传…

关于技术架构的思考

技术选型实则是取舍的艺术 这句话是我偶然在一篇技术架构方面的文章上看到的&#xff0c;每当我需要给新项目进行技术选型&#xff0c;决定技术架构时&#xff0c;一直坚信的。 当我们做技术选型时&#xff0c;需要考虑的东西非常多。比如&#xff0c;用关系型数据库还是非关…

uniapp之屏幕右侧出现滚动条去掉、隐藏、删除【好用!】

目录 问题解决大佬地址最后 问题 解决 在最外层view上加上class“content”;输入以下样式。注意&#xff1a;两个都必须存在在生效。 .content {/* 跟屏幕高度一样高,不管view中有没有内容,都撑开屏幕高的高度 */height: 100vh; overflow: auto; } .content::-webkit-scrollb…

自动化测试(三)webdriver的常用api(1)

目录 等待 sleep休眠 隐式等待 显式等待 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器宽、高 操作浏览器的前进、后退 控制浏览器滚动条 键盘事件 键盘按键用法 键盘组合键用法 鼠标事件 定位一组元素 前面两章我们讲了selenium环境的…