全排列

176 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

上一题比较tricky,没有用到真正的排列组合算法,由于情况太特殊了,如果换成数字就没法实现了,所以我们还是看一下正常的题目和解法。

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]

输出:

[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]\

解法:

和上题一样都是全排列,但是变成了一串数字。处理方法和上一题就不一样了,因为字符串插入很简单,但是数组插入的话就会很费时间,所以就不能投机了,这里用最经典的回溯思路来进行数字的全排列。

算法用dfs,用used数组记录当前数字是否选过,然后一直选到不能选为止,记得要恢复状态。(附件有详细图解)

代码:

class Solution {
private:
    vector> res;
public:
    void dfs(vector& tmp, vector& used, vector& nums){
        if(tmp.size()==used.size()){
            res.push_back(tmp);
            return;
        }
        for(int i=0; i> permute(vector& nums) {
        res.clear();
        if(nums.empty()) return res;
        vector tmp;
        vector used(nums.size(),false);
        dfs(tmp,used,nums);
        return res;
    }
};