输出自然数 1 1 到 � n 所有不重复的排列,即 � n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
时间: 2023-05-30 08:05:02 浏览: 196
PAT计算机能力考试乙级1-10题答案.doc
这个问题可以使用回溯法来解决。回溯法是一种通过尝试所有可能的解来求解问题的算法。在这个问题中,我们可以从第一个位置开始枚举所有可能的数字,然后依次尝试填入后面的位置,直到填满所有位置为止。
具体来说,我们可以定义一个递归函数,该函数接收一个当前已经填好的数字序列和一个表示还剩下哪些数字可以填入的集合。在每一次递归中,我们枚举集合中的所有数字,尝试将其填入当前序列的下一个位置,并将该数字从集合中删除。然后递归调用函数,继续填下一个位置。当序列填满时,我们将该序列加入结果集中。
代码如下:
```
void backtrack(vector<int>& nums, vector<int>& path, unordered_set<int>& used, vector<vector<int>>& res) {
if (path.size() == nums.size()) {
res.push_back(path);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (used.count(nums[i])) continue;
path.push_back(nums[i]);
used.insert(nums[i]);
backtrack(nums, path, used, res);
used.erase(nums[i]);
path.pop_back();
}
}
vector<vector<int>> permute(int n) {
vector<int> nums(n);
for (int i = 1; i <= n; i++) nums[i-1] = i;
vector<vector<int>> res;
vector<int> path;
unordered_set<int> used;
backtrack(nums, path, used, res);
return res;
}
```
在这个代码中,我们使用一个 unordered_set 来记录哪些数字已经被使用过了,这样可以避免重复。在递归函数中,我们首先判断当前序列是否已经填满,如果是,就将其加入结果集中。否则,我们枚举集合中的所有数字,尝试将其填入当前序列的下一个位置,并递归调用函数。在递归返回后,我们需要将该数字从集合中删除,并从序列中弹出,以便尝试下一个数字。
最后,我们调用 permute 函数即可得到所求的结果。
阅读全文