目录
前言:
首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这是和之前分析的子集以及组合所不同的地方。
所以这里不使用Index,但依旧需要used数组标记已经选择的元素。
一、全排列
题目描述:#力扣题目链接
给定一个不含重复数字的数组 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
中的所有整数 互不相同
思路和想法:
这道题的思路在于判断是否重复提取同一个元素,相较于之前的组合问题,不能采用startIndex来定位,排列问题每次都要从头开始搜索。
这里使用used数组标记已经选择的元素。
class Solution {
vector<vector<int>> result;
vector<int> path;
void backtracing(vector<int>& nums, vector<bool>& used){
if (path.size() == nums.size()) {
result.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]);
backtracing(nums, used);
path.pop_back();
used[i] = false;
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> used(nums.size(), false);
path.clear();
result.clear();
if(nums.size() == 0){
return result;
}
backtracing(nums, used);
return result;
}
};
二、全排列 II
题目描述: #力扣题目链接
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
输入输出示例:
示例1:
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
示例2:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
思路和想法:
相较于全排列上一道题来讲,区别在于可能包含重复数字序列。组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果。
这里则是取最后的叶节点。
class Solution {
vector<vector<int>> result;
vector<int> path;
void backtracing(vector<int> & nums, vector<bool> used){
if(path.size() == nums.size()){
result.push_back(path);
return;
}
for(int i = 0; i < nums.size(); i++){
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
continue;
}
if (used[i] == false) {
used[i] = true;
path.push_back(nums[i]);
backtracing(nums, used);
path.pop_back();
used[i] = false;
}
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
result.clear();
path.clear();
if(nums.size() == 0){
return result;
}
sort(nums.begin(), nums.end());
vector<bool> used(nums.size(), false);
backtracing(nums, used);
return result;
}
};