题目解析
题目如下:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:
1.固定一个数字,选择此数字的存放位置,开头的数字然后处理省下数组中数的存放位置(递归)
2.下次递归时数组中数据个数应该排除当前递归的数字,而下次递归结束时当前数组中应该包括当前处理的数字(回溯)
3.下次递归时省下的数组中数据位置应该保持原样(循环队列)
4.循环1 2两步,每次循环时改变当前固定数字的存放位置
代码实现
class Solution {
public:
vector<vector<int>> result;
vector<vector<int>> permute(vector<int>& nums) {
vector<int> dst(nums.size());
queue<int> q;
for(int i = 0; i < nums.size(); i++)
{
q.push(i);
}
traverse(nums, dst, q, 0);
return result;
}
void traverse(vector<int>& src, vector<int>& dst, queue<int>& q, int src_index){
if(q.empty())
{
result.push_back(dst);
return;
}
int dst_index;
for(int i = 0; i < q.size(); i++)
{
dst_index = q.front();
q.pop();
dst[dst_index] = src[src_index];
traverse(src, dst, q, src_index + 1);
q.push(dst_index);
}
}
};