LeetCode 46. 全排列

博客围绕给定无重复数字序列求全排列展开。思路是运用回溯算法模板,设置一个map标记nums数组元素是否已使用,加入选择时标记,撤销选择时撤销标记,最终得出所有可能的全排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

给定一个 没有重复 数字的序列,返回其所有可能的全排列。
在这里插入图片描述

思路

1.这道题比电话号码那道简单得多,就是求给定的一串数字的全排列。直接上回溯算法的模板:

result = []
void backtrack():
    if (满足结束条件)
        result.add(路径);
        return;
    
    for 选择 in 选择列表:
        做选择;
        backtrack();
        撤销选择;

2.需要设置一个用于标记nums数组的第i个元素是否已经使用过的map,因为题目要求不能有重复数字。在将当前的数字加入选择之后,对当前数字的位置进行标记;撤销选择之后,对标记进行撤销。

解答

class Solution {
public:
vector<vector<int> > res;
vector<int> tmp;//暂时存储一种排列组合
map<int, bool> sign_map;//标记nums的第n位置的数是否已经使用过
int N;
    vector<vector<int>> permute(vector<int>& nums) {
        N = nums.size();
        backTrack(nums);
        return res;
    }
    void backTrack(vector<int>& nums){
        if (tmp.size() == N){//当前的长度已经符合要求
            res.push_back(tmp);
            return;
        }
        for(int i = 0;i < nums.size(); ++i){
            if(sign_map[i] != 1){
                tmp.push_back(nums[i]);
                sign_map[i]= 1;//设置标记,第n位置的数已经使用过
                backTrack(nums);
                tmp.pop_back();
                sign_map[i] = 0;//设置标记
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值