全排列
题目描述
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
解题思路
每次选取一个数据,然后把该数据从数组中删除。
但是我每次需要重新生成一个新的数组,并且赋给下一层。
官方的题解使用了一个辅助数组,这样子可以省去很多内存,以及频繁创建和在数组中删除元素的开销。
题解
我的解法
1ms,不是最优的解法
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
void BackTrack(vector<int> nums){
if(nums.size() == 1){
path.push_back(nums[0]);
ans.push_back(path);
path.pop_back();
return;
}
for(int i = 0; i < nums.size(); i++){
path.push_back(nums[i]);
vector<int> temp(nums);
temp.erase(temp.begin() + i);
BackTrack(temp);
path.pop_back();
}
return;
}
vector<vector<int>> permute(vector<int>& nums) {
BackTrack(nums);
return ans;
}
};
最优的解法
0ms,效率最高。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking (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; // path里已经收录的元素,直接跳过
used[i] = true;
path.push_back(nums[i]);
backtracking(nums, used);
path.pop_back();
used[i] = false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
result.clear();
path.clear();
vector<bool> used(nums.size(), false);
backtracking(nums, used);
return result;
}
};