【LeetCode】0046.全排列 (递归详解)
题目要求
- 要求在给定的一个 没有重复 数字的序列,返回其所有可能的全排列。
图解示例
算法思想
使用递归的方法
- 设计全局变量(也就是返回值),设计存储分步结果的列表,设计一个数组,用来判断该数是否已经在分步结果中
- 特判,如果传入的是一个空列表,那返回空列表
- 开始设计递归函数
- 根据 题目要求 和 图解示例
- 设置递归边界,若层数与列表容量
len
相等,即列表中的所有值都在分步结果result
中了,然后将result
加入ans
中 - 如图解示例所示,遍历整个数组,得到
layer = 1
的情况下,分步数组的值 - 如果这个值没有被访问过,那么把这个值放入分步结果
result
中,并将标记数组中该值的位置定义为true
- 得到这一状态下的值
layer = 1
之后,进入layer = 2
的状态 - 当一串遍历返回之后,就将标记数组中该值的位置定义为
false
,对之后的其他结果遍历不造成影响 - 最后将该值从
result
中pop
出来
我将每一步递归都打出来,更方便大家理解
完整代码
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.全排列 (递归详解)相关推荐
- [学习C++ ]C++ STL 全排列函数详解(排列组合与匹配算法)--1
一.概念 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a ...
- python中字符串乘法_python leetcode 字符串相乘实例详解
给定两个以字符串形式表示的非负整数 num1 和 num2 ,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...
- Java学习第八天<什么是方法><方法的定义和调用><方法的重载><命令行传参><可变参数><递归详解>
什么是方法 System.out.println(); 调用系统类里的标准输出对象(out)中的方法println public class Demo01 {//main 方法public stati ...
- 求n的阶乘的算法框图_当代程序员必备技能(算法)之:递归详解 - Java斗帝之路...
前言 递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它.在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法.它太基础太重要了,这也是为什么面试的时候,面试官 ...
- python递归详解_python基于递归解决背包问题详解
递归是个好东西,任何具有递归性质的问题通过函数递归调用会变得很简单.一个很复杂的问题,几行代码就能搞定. 最简单的递归问题:现有重量为weight的包,有若干重量分别为W1,W2.....Wn的物品, ...
- 递归详解——让你真正明白递归的含义
哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...
- java 递归详解_Java递归函数讲解
Java中的递归 什么是递归? 函数直接或间接调用自身的过程称为递归,相应的函数称为递归函数.使用递归算法,某些问题可以很容易地解决.这类问题的例子有Hanoi的Towers(TOH).序/前序/后序 ...
- python递归详解_打破递归栈的深度限制: 解析一种Python尾递归优化的方法
Python的递归调用栈的深度有限制, 可以通过sys.getrecursionlimit()查看. 尾递归在很多语言中都可以被编译器优化, 基本都是直接复用旧的执行栈, 不用再创建新的栈帧, 原理上 ...
- python递归详解_Python理解递归的方法总结
递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...
最新文章
- 在Relay中注册新TVM算子
- openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old
- java——慎用可变参数列表
- 详解python正则\b和\B的区别
- Chapter 1 First Sight——25
- Django从理论到实战(part16)--指定默认的参数
- session很快失效_一口气说出 4 种分布式一致性 Session 实现方式,面试杠杠的~
- 美链BEC合约漏洞技术分析 1
- Android自定义View之上拉、下拉列表 头部元素跟随 缩放、平移效果的实现
- 百度网盘突破下载限速
- xenu死链接工具使用
- 蓦然回首,已然踏上编程路
- mac php fpm.pid,php-fpm的常用配置和优化
- 深入理解Instrument
- python软著申请_软著申请注意事项放心选择
- 【已鸽】手机添加nfc模块模拟ic卡开门禁
- python游戏联机_CoderZh首款Python联机对战游戏 - NancyTetris1.0倾情发布(一)
- MarkdownPad入门级编写不完全指南
- java jit 编译器_浅谈对JIT编译器的理解。
- HDU - 5852 Intersection is not allowed! LGV定理
热门文章
- 使用 Linux 系统调用的内核命令图解
- Win10安装NodeJS
- 设计模式总结 (1)模式分类
- 比特币钱包(5) BIP44 账户表示形式
- C++ Primer 5th笔记(chap 13 拷贝控制)移动构造和移动赋值
- 6. Qt 信号与信号槽(11)Qt::ConnectionType类型
- 深度探索C++ 对象模型(7)-Data member的布局(多重继承)
- 近世代数--多项式环--未定元的存在性
- 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
- 网络互连基础——笔记