全排列--回溯

news/2024/11/19 17:37:58/

1题目

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

2链接

题目链接:46. 全排列 - 力扣(LeetCode)

视频链接:组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列_哔哩哔哩_bilibili

3解题思路

注意了注意了!这个题目是排列,已经不是组合了!

组合的题目因为无序不能向前取,所以需要startIndex来控制向后取值。本题排列无需

以[1,2,3]为例,抽象成树形结构如下:

回溯三部曲;

1、确定函数参数及返回值

首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方

可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。

但排列问题需要一个used数组,标记已经选择的元素,如上图橘黄色部分所示。要不然我怎么知道还能取哪些数,万一再取到自己本身不就尬住了嘛。

vector<vector<int>> result;
vector<int> path;
void backtracking (vector<int>& nums, vector<bool>& used)

2、确定递归终止条件

可以看出叶子节点,就是收割结果的地方。

那么什么时候,算是到达叶子节点呢?

当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。

// 此时说明找到了一组
if (path.size() == nums.size()) {result.push_back(path);return;
}

3、确定单层递归逻辑

used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次

for (int i = 0; i < nums.size(); i++) {if (used[i] == true) continue; // path里已经收录的元素,直接跳过used[i] = true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] = false;
}

这整体过程和思路真的和我前面几篇写的高度相似,很容易就能想到。现在对于这种题我甚至都可以手撕代码了....

4代码

class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() == nums.size()) {result.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {if (used[i] == true) continue; // path里已经收录的元素,直接跳过used[i] = true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {result.clear();path.clear();vector<bool> used(nums.size(), false);backtracking(nums, used);return result;}
};


http://www.ppmy.cn/news/238888.html

相关文章

Python数据攻略-Pandas常用数据操作

大家好&#xff0c;我是Mr数据杨。今天我将带领各位走进Python的奇妙世界&#xff0c;就像步入三国演义那样热闹且复杂的战争年代。这里&#xff0c;数据就像那些智勇双全的武将和策士&#xff0c;我们要学习如何访问和修改它们&#xff0c;就如同诸葛亮那样掌控战局。 先来理…

fs基本使用

//文件下载 var fs require("fs"); var path require("path"); var request require("request");var download function (item) {let url"https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json"// https://geo.datav.al…

Mac Xshell 下载 (FinallShell)

Mac Xshell 下载 找了好久 的Mac Xshell 下载 finallshell 找了好久 的Mac Xshell 下载 finallshell 自从换了Mac工作电脑 一直没有找到过好用的 Xshell,今天突然发现了这个。太好用了 FinalShell 官网&#xff1a;http://www.hostbuf.com/ 以下是从官网拷贝的。 FinalShell是…

s3fsfuse调试

这里由于是调试fuse操作&#xff0c;所以使用attach process的方式调试&#xff0c;方式参照《vscode使用attach process调试进程》这篇笔记 libfuse.so里面代码暂时不知道怎么跳进去 所以我这里挨个点进定义的首行代码打上断点。 一、测试ll /mnt/s3 s3fs_getattr s3fs_ac…

FS模式

1. 什么是FS模式?为什么要使用FS模式 S :动态的,静态的变量. F :不变的,常量. 最近在重构一系统,发现N多常量类,有此感受! FS模式是解决系统中存在大量常量类,管理混乱的问题. JAVA中常量类最好只有一个,便于查找.提高编码效率.加强可读性. 2. 怎么使用FS模式? 原则1: 对…

node-fs模块

fs模块 这篇文章来谈一谈node的内置模块之一fs文件系统模块。 有很多api&#xff0c;下面来说一下比较常见的api: 1.读取文件 readFile(path,callback) 异步操作 fs.readFile("../q.txt",(err,data)>{console.log(data);})readFileSync(path) 同步操作 con…

【node.js】fs 模块

fs 文件系统 fs (file system) 文件系统&#xff0c;属于 node.js 的核心模块&#xff0c;用于操作文件(夹) 使用 fs&#xff0c;需要先引入该模块 核心模块的标识就是模块的名字&#xff0c;这里就是 fs const fs require(fs);同步和异步调用 fs 模块中的操作有 2 种形式…

node的fs模块

node的fs模块 前几天一个月薪35k的兄弟&#xff0c;给我推了一个人工智能学习网站&#xff0c;看了一段时间挺有意思的。包括语音识别、机器翻译等从基础到实战都有&#xff0c;很详细&#xff0c;分享给大家。大家及时保存&#xff0c;说不定啥时候就没了。 一、简述 fs模块…