题目要求

  1. 要求在给定的一个 没有重复 数字的序列,返回其所有可能的全排列。

图解示例

算法思想

使用递归的方法

  1. 设计全局变量(也就是返回值),设计存储分步结果的列表,设计一个数组,用来判断该数是否已经在分步结果中
  2. 特判,如果传入的是一个空列表,那返回空列表
  3. 开始设计递归函数
  4. 根据 题目要求图解示例
  5. 设置递归边界,若层数与列表容量 len 相等,即列表中的所有值都在分步结果 result 中了,然后将 result 加入 ans
  6. 如图解示例所示,遍历整个数组,得到 layer = 1 的情况下,分步数组的值
  7. 如果这个值没有被访问过,那么把这个值放入分步结果 result 中,并将标记数组中该值的位置定义为 true
  8. 得到这一状态下的值 layer = 1 之后,进入 layer = 2 的状态
  9. 当一串遍历返回之后,就将标记数组中该值的位置定义为 false,对之后的其他结果遍历不造成影响
  10. 最后将该值从 resultpop 出来

我将每一步递归都打出来,更方便大家理解

完整代码

class Solution {
public:vector<vector<int> > permute(vector<int>& nums) {int len = nums.size();if (len == 0) {return ans;}vector<int> result;bool flag[len] = {false};findPermute(0, result, nums, len, flag);return ans;}
private:vector<vector<int> > ans;void findPermute(int layer, vector<int> result, vector<int>& nums, int len, bool flag[]) {if(layer==len){ans.push_back(result);return;}for(int i = 0; i < len; i++) {if(!flag[i]) {result.push_back(nums[i]);flag[i] = true;findPermute(layer+1, result, nums, len, flag);flag[i] = false;result.pop_back();}}}
};

设计分析

时间复杂度:O(n * n!)(数数图解的箭头吧!)

空间复杂度:O(n)

提交结果

若有其他解法,欢迎评论区补充。

【LeetCode】0046.全排列 (递归详解)相关推荐

  1. [学习C++ ]C++ STL 全排列函数详解(排列组合与匹配算法)--1

    一.概念 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a ...

  2. python中字符串乘法_python leetcode 字符串相乘实例详解

    给定两个以字符串形式表示的非负整数 num1 和  num2 ,返回  num1 和  num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...

  3. Java学习第八天<什么是方法><方法的定义和调用><方法的重载><命令行传参><可变参数><递归详解>

    什么是方法 System.out.println(); 调用系统类里的标准输出对象(out)中的方法println public class Demo01 {//main 方法public stati ...

  4. 求n的阶乘的算法框图_当代程序员必备技能(算法)之:递归详解 - Java斗帝之路...

    前言 递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它.在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法.它太基础太重要了,这也是为什么面试的时候,面试官 ...

  5. python递归详解_python基于递归解决背包问题详解

    递归是个好东西,任何具有递归性质的问题通过函数递归调用会变得很简单.一个很复杂的问题,几行代码就能搞定. 最简单的递归问题:现有重量为weight的包,有若干重量分别为W1,W2.....Wn的物品, ...

  6. 递归详解——让你真正明白递归的含义

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  7. java 递归详解_Java递归函数讲解

    Java中的递归 什么是递归? 函数直接或间接调用自身的过程称为递归,相应的函数称为递归函数.使用递归算法,某些问题可以很容易地解决.这类问题的例子有Hanoi的Towers(TOH).序/前序/后序 ...

  8. python递归详解_打破递归栈的深度限制: 解析一种Python尾递归优化的方法

    Python的递归调用栈的深度有限制, 可以通过sys.getrecursionlimit()查看. 尾递归在很多语言中都可以被编译器优化, 基本都是直接复用旧的执行栈, 不用再创建新的栈帧, 原理上 ...

  9. python递归详解_Python理解递归的方法总结

    递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...

最新文章

  1. 在Relay中注册新TVM算子
  2. openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old
  3. java——慎用可变参数列表
  4. 详解python正则\b和\B的区别
  5. Chapter 1 First Sight——25
  6. Django从理论到实战(part16)--指定默认的参数
  7. session很快失效_一口气说出 4 种分布式一致性 Session 实现方式,面试杠杠的~
  8. 美链BEC合约漏洞技术分析 1
  9. Android自定义View之上拉、下拉列表 头部元素跟随 缩放、平移效果的实现
  10. 百度网盘突破下载限速
  11. xenu死链接工具使用
  12. 蓦然回首,已然踏上编程路
  13. mac php fpm.pid,php-fpm的常用配置和优化
  14. 深入理解Instrument
  15. python软著申请_软著申请注意事项放心选择
  16. 【已鸽】手机添加nfc模块模拟ic卡开门禁
  17. python游戏联机_CoderZh首款Python联机对战游戏 - NancyTetris1.0倾情发布(一)
  18. MarkdownPad入门级编写不完全指南
  19. java jit 编译器_浅谈对JIT编译器的理解。
  20. HDU - 5852 Intersection is not allowed! LGV定理

热门文章

  1. 使用 Linux 系统调用的内核命令图解
  2. Win10安装NodeJS
  3. 设计模式总结 (1)模式分类
  4. 比特币钱包(5) BIP44 账户表示形式
  5. C++ Primer 5th笔记(chap 13 拷贝控制)移动构造和移动赋值
  6. 6. Qt 信号与信号槽(11)Qt::ConnectionType类型
  7. 深度探索C++ 对象模型(7)-Data member的布局(多重继承)
  8. 近世代数--多项式环--未定元的存在性
  9. 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
  10. 网络互连基础——笔记