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
将搜索空间视为一棵树:
首先排列是有序的,也就是说 [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)!