自学内容网 自学内容网

LeetCode-46 全排列

LeetCode-46 全排列

题目描述

给定一个不含重复数字的数组 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 中的所有整数 互不相同

解题思路

使用回溯算法解决排列、组合、子集问题。
对于一个长度为 n 的数组(假设元素互不重复),其排列方案数共有:n×(n−1)×(n−2)…×2×1
将搜索空间视为一棵树:
Alt
首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。

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

但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示。

代码

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> used(nums.size(), false);
        back_tracking(nums, used);
        return res;
    }
private:
    vector<vector<int>> res;
    vector<int> path;

    void back_tracking(vector<int>& nums, vector<bool>& used) {
        if (path.size() == nums.size()) {
            res.push_back(path);
            return;
        } else {
            for (int i = 0; i < nums.size(); i++) {
                if (used[i] == true) continue;
                used[i] = true;
                path.push_back(nums[i]);
                back_tracking(nums, used);
                path.pop_back();
                used[i] = false;
            }
        }
    }
    
};

原文地址:https://blog.csdn.net/weixin_51332735/article/details/139311153

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!