46. 全排列
✅做题思路or感想
排列问题,一眼回溯法
排列问题注重元素间的排序,而集合问题不用。
故这里并不需要startIndex
来进行控制元素取值范围,而是需要用used
数组来记录元素是否使用过,避免一个元素的多次使用
递归三部曲
递归参数
- 用一个
used
数组来记录使用记录
递归中止条件
- 当
temp
和原数组等大时,就可以收网了
递归单层逻辑
- 判断元素是否使用过,若没用过,则加入
temp
中
class Solution {
public:
vector<int>temp;
vector<vector<int>>result;
void dfs(vector<int>& nums, vector<bool>& used) {
//递归中止条件
if (temp.size() == nums.size()) {
result.push_back(temp);
return;
}
for (int i = 0; i < nums.size(); i++) {
//防止一个元素使用多次
if (used[i] == false) {
temp.push_back(nums[i]);
used[i] = true;
dfs(nums, used);
temp.pop_back();
used[i] = false;
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<bool>used(nums.size(), false);
dfs(nums, used);
return result;
}
};