LeetCode hot 100—全排列

题目

给定一个不含重复数字的数组 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]]

分析

回溯算法是一种通过尝试所有可能的组合来解决问题的方法,对于全排列问题,它会递归地生成所有可能的排列。

回溯法

使用一个标记数组记录每个数字是否已被使用,当当前构建的排列长度等于数组长度时,将其确定为一个全排列并加入结果数组。在递归过程中,遍历数组中的每个数字,若该数字未被使用,则将其加入当前排列并标记为已使用,接着递归构建下一个位置的排列,完成递归后进行回溯,即撤销该数字的使用标记并从当前排列中移除,继续尝试其他数字,以此穷举所有可能的全排列组合。

时间复杂度:O(),其中 为数组的长度

空间复杂度:O()

cpp 复制代码
class Solution {
public:
    std::vector<std::vector<int>> permute(std::vector<int>& nums) {
        std::vector<std::vector<int>> result;
        std::vector<int> current;
        std::vector<bool> used(nums.size(), false);
        backtrack(nums, used, current, result);
        return result;
    }
private:
    void backtrack(const std::vector<int>& nums, std::vector<bool>& used, std::vector<int>& current, std::vector<std::vector<int>>& result) {
        // 如果当前排列的长度等于数组的长度,说明已经生成了一个全排列
        if (current.size() == nums.size()) {
            result.push_back(current);
            return;
        }
        for (int i = 0; i < nums.size(); ++i) {
            // 如果该数字已经在当前排列中使用过,则跳过
            if (used[i]) continue;
            // 选择当前数字
            used[i] = true;
            current.push_back(nums[i]);
            // 递归生成下一个位置的排列
            backtrack(nums, used, current, result);
            // 回溯,撤销选择
            used[i] = false;
            current.pop_back();
        }
    }
};
相关推荐
2501_924747111 小时前
驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
人工智能·算法·计算机视觉·智能手机
limitless_peter2 小时前
优先队列,链表优化
c++·算法·链表
屁股割了还要学4 小时前
【数据结构入门】栈和队列
c语言·开发语言·数据结构·学习·算法·青少年编程
Monkey的自我迭代4 小时前
支持向量机(SVM)算法依赖的数学知识详解
算法·机器学习·支持向量机
阿彬爱学习5 小时前
AI 大模型企业级应用落地挑战与解决方案
人工智能·算法·微信·chatgpt·开源
L.fountain5 小时前
配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
算法·配送
啊阿狸不会拉杆8 小时前
《算法导论》第 13 章 - 红黑树
数据结构·c++·算法·排序算法
qiuyunoqy9 小时前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝
lifallen9 小时前
Kafka ISR机制和Raft区别:副本数优化的秘密
java·大数据·数据库·分布式·算法·kafka·apache
m0_6265352010 小时前
贪心算法学习 3 买卖股票的最佳时机 i ii
学习·算法·贪心算法