全排列--回溯

1题目

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

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

2链接

题目链接:46. 全排列 - 力扣(LeetCode)

视频链接:组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列_哔哩哔哩_bilibili

3解题思路

注意了注意了!这个题目是排列,已经不是组合了!

组合的题目因为无序不能向前取,所以需要startIndex来控制向后取值。本题排列无需

以[1,2,3]为例,抽象成树形结构如下:

全排列--回溯_第1张图片

回溯三部曲;

1、确定函数参数及返回值

首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方

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

但排列问题需要一个used数组,标记已经选择的元素,如上图橘黄色部分所示。要不然我怎么知道还能取哪些数,万一再取到自己本身不就尬住了嘛。

vector> result;
vector path;
void backtracking (vector& nums, vector& used)

2、确定递归终止条件

可以看出叶子节点,就是收割结果的地方。

那么什么时候,算是到达叶子节点呢?

当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。

// 此时说明找到了一组
if (path.size() == nums.size()) {
    result.push_back(path);
    return;
}

3、确定单层递归逻辑

used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次

for (int i = 0; i < nums.size(); i++) {
    if (used[i] == true) continue; // path里已经收录的元素,直接跳过
    used[i] = true;
    path.push_back(nums[i]);
    backtracking(nums, used);
    path.pop_back();
    used[i] = false;
}

这整体过程和思路真的和我前面几篇写的高度相似,很容易就能想到。现在对于这种题我甚至都可以手撕代码了....

4代码

class Solution {
public:
    vector> result;
    vector path;
    void backtracking (vector& nums, vector& 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里已经收录的元素,直接跳过
            used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums, used);
            path.pop_back();
            used[i] = false;
        }
    }
    vector> permute(vector& nums) {
        result.clear();
        path.clear();
        vector used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
};

你可能感兴趣的:(LeetCode练习,算法,c++)