当前位置: 首页 > news >正文

(回溯) LeetCode 46. 全排列

原题链接

一. 题目描述

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

二. 解题思路

本题就是一个排列问题,给定你一个数组,要求你输出该数组中元素的所有排列情况。这里我们使用的方法还是回溯,通过将数组中的元素以不同的顺序前后分别加入到path 数组中从而形成不同的排列情况,还是简单的三件套,你还记得吗?

1. 确定递归参数:首先nums 基础数组必不可少,再有就是startindex 记录遍历位置,其实这里并不需要,因为我们是通过不同的顺序将元素加入到path 中,所以每一次都从开始位置即可,不过得定义一个used 数组用来记录当前的元素是否已经被加入到path 中。

2. 确定递归终止条件:由于是排列问题,所以每一个排列的大小都和数组nums 的大小是相同的,所以当path 的大小等于nums 大小的时候就可以收集结果并return 了。

3. 单层递归:每一次都从第一位开始, 判断是否被加入,如果已经被加入就直接跳过,如果没有就加入,然后进行递归,在递归完之后回溯进行下一次。

具体的路线图大家可以看一下下面这个代码随想录的示例图(偷过来的):

话不多说!!!上代码!!

三. 代码

class Solution {
public:vector<vector<int>> res;vector<int> path;void back(vector<int>& nums, vector<bool> used){if(path.size() == nums.size()){res.push_back(path);return;}for(int i = 0; i < nums.size(); i++){if(used[i]) continue;else{path.push_back(nums[i]);used[i] = true;back(nums, used);used[i] = false;path.pop_back();}}}vector<vector<int>> permute(vector<int>& nums) {vector<bool> used(nums.size(), false);back(nums, used);return res;}
};

四. 总结

本题和之前做过的有一些不一样,不过思路都是大差不差的,大家一定要多思考,实在不会就去找个纸笔盯着代码一行一行把每一步的执行结果写下来,这样会清晰很多。千万不能只看一眼感觉自己会了就不去写了,或者像一些人一样(咳咳,当然不是我啊)直接抄上之后看都不看。加油!!!

时间复杂度:O(n!);

空间复杂度:O(n)。

喜欢的话给个关注吧!!

相关文章:

  • 如何用 CocosCreator 对接抖音小游戏的侧边栏复访
  • 排查MAC地址是否冲突——arping工具详解
  • MySQL中的索引——适合创建索引的情况
  • rknn yolo系列之量化前预处理,解决量化精度低以及出现类似未作nms的很多框子的问题
  • 在js中实现两个对象合并,若重复以第一个对象中的数据为准
  • 【机器学习】卷积神经网络简介
  • Android控件(示例)
  • 生成iOS LaunchImage脚本
  • “服务之巅:Spring Cloud中SLA监控与管理的艺术“
  • 【JavaEE】初步认识多线程
  • 【论文泛读】ZKML: An Optimizing System for ML Inference in Zero-Knowledge Proofs
  • springboot自定义starter
  • 【漏洞复现】某赛通数据泄露防护(DLP)系统 NetSecConfigAjax SQL注入漏洞
  • docker docker-compose创建容器并运行时发现redis.conf: Is a directory
  • springboot+neo4j的demo
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 30秒的PHP代码片段(1)数组 - Array
  • Fastjson的基本使用方法大全
  • HashMap剖析之内部结构
  • input的行数自动增减
  • Laravel 实践之路: 数据库迁移与数据填充
  • Lsb图片隐写
  • React-flux杂记
  • SegmentFault 2015 Top Rank
  • 从零开始的无人驾驶 1
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端存储 - localStorage
  • 入口文件开始,分析Vue源码实现
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 正则表达式-基础知识Review
  • ​【已解决】npm install​卡主不动的情况
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (LeetCode C++)盛最多水的容器
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (黑马C++)L06 重载与继承
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (四)js前端开发中设计模式之工厂方法模式
  • (一) 初入MySQL 【认识和部署】
  • (转载)深入super,看Python如何解决钻石继承难题
  • ***测试-HTTP方法
  • ***利用Ms05002溢出找“肉鸡
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core引入性能分析引导优化
  • .NET DataGridView数据绑定说明
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 服务 ServiceController
  • .NetCore部署微服务(二)
  • .Net接口调试与案例