本文记录的是刷题过程中的重要概念和笔记。如有侵权,请联系删除。
46.全排列
力扣题目链接(opens new window)
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
思路
排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。
used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次。
class Solution
{
public:
vector<vector<int>> res;
vector<int> path;
void backtracing(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])
continue;
else
{
used[i] = true;
path.push_back(nums[i]);
backtracing(nums, used);
path.pop_back();
used[i] = false;
}
}
}
vector<vector<int>> permute(vector<int> &nums)
{
res.clear();
path.clear();
if (nums.size() == 0)
return res;
vector<bool> used(nums.size(), false);
backtracing(nums, used);
return res;
}
};
总结
排列问题的不同:
- 每层都是从0开始搜索而不是startIndex
- 需要used数组记录path里都放了哪些元素了
排列问题是回溯算法解决的经典题目