leetCode 46. 全排列 + 回溯算法 + 图解 + 笔记

46. 全排列 - 力扣(LeetCode)

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案

示例 1:

cpp 复制代码
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

cpp 复制代码
输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

cpp 复制代码
输入:nums = [1]
输出:[[1]]

>>回溯三部曲:

1).确定回溯函数参数

  • path来收集符合条件的结果
  • result 保存 path,作为结果集
  • used排列问题需要标记已经选择的元素

注意{1,2}{2,1} 是不同的排序组合,因为排序不同;但 {1,2} 和**{2,1}** 是相同的组合,因为元素相同。所以处理组合问题需要 startIndex ,处理排列问题就不用使用 startIndex

cpp 复制代码
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums,vector<bool>& used)

2).递归的终止条件

  • 收割叶子节点
cpp 复制代码
if(path.size() == nums.size()) {
    result.push_back(path);
    return;
}

3).单层搜索的逻辑

used 是用来标记取过了哪些元素,那接下来,在剩余的这个集合里边取的时候,取过的元素别重复取就行了!因为一个排列里一个元素只能使用一次(来自代码随想录Carl的文章)

  • if(usedi==true) continue;
cpp 复制代码
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里已经收录的元素,直接跳过
            path.push_back(nums[i]);
            used[i]=true;
            backtracking(nums,used);
            used[i]=false;
            path.pop_back();
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> used(nums.size(),false);
        backtracking(nums,used);
        return result;
    }
};
  • 时间复杂度: O(n!)
  • 空间复杂度: O(n)

>>与前期文章的区别:

1.leetCode 77.组合问题 、leetCode 131.切割问题、leetCode 78.子集问题需要用startIndex,

  • startIndex来控制for循环的起始位置
  • used 是bool型数组,用来记录同一树枝上的元素是否使用过

2.本题

  • 每层都是从0开始搜索,并不是startIndex
  • used是用来标记取过了哪些元素

推荐和参考文章、视频:
组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV19v4y1S79W/?spm_id_from=333.788&vd_source=a934d7fc6f47698a29dac90a922ba5a3代码随想录 (programmercarl.com)https://www.programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html#%E6%80%9D%E8%B7%AF

相关推荐
折哥的程序人生 · 物流技术专研6 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
AOwhisky6 小时前
Redis 学习笔记(第三期):持久化与主从复制
运维·数据库·redis·笔记·学习·云计算
问心无愧05136 小时前
ctf show web入门160 161
前端·笔记
想吃火锅10057 小时前
【leetcode】14.最长公共前缀js
算法·leetcode·职场和发展
云絮.8 小时前
数据库操作
数据库·mysql·算法·oracle
小林ixn8 小时前
LeetCode 206. 反转链表(迭代 + 递归详解)
算法·leetcode·链表
凡人叶枫9 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
菜鸟‍10 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展
乘~风10 小时前
408考研-计组-1.2计算机系统层次结构笔记+1.3计算机性能指标
笔记·考研·408
.千余11 小时前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他