11 全排列(leecode 46)

1 问题

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

示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

2 解法

排列问题与集合不同的地方在于,排列是有序的,也就是说[1,2] 和[2,1] 是两个集合。

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

但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示:
在这里插入图片描述

class Solution {
    
    
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracking(vector<int>& nums, vector<bool> used)
    {
    
    
        if(path.size() == nums.size())
        {
    
    
            res.push_back(path);
            return;
        }
        for(int i = 0; i < nums.size(); i++)
        {
    
    
            //去重
            if(used[i] == true)
                continue;
            used[i] = true;
            path.push_back(nums[i]);
            //递归
            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 res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_42454048/article/details/113871979