全排列
枚举所有可能的排列:通过递归选择未使用的元素加入当前路径,完成选择后回溯
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> path;
vector<bool> used(nums.size(), false);
backtrack(nums, ans, path, used);
return ans;
}
void backtrack(vector<int>& nums, vector<vector<int>>& ans, vector<int>& path, vector<bool>& used) {
if (path.size() == nums.size()) {
ans.push_back(path);
return;
}
// 遍历所有元素,尝试将未选中的元素加入当前路径
for (int i = 0; i < nums.size(); i++) {
if (used[i]) {
continue;
}
// 将当前元素加入路径,并标记为已使用
path.push_back(nums[i]);
used[i] = true;
// 继续构建下一个位置的元素
backtrack(nums, ans, path, used);
// 回溯
path.pop_back();
used[i] = false;
}
}
};


查看16道真题和解析