思路:这是一道暴力搜索问题,我们需要列出答案的所有可能组合。
题目给我们一个数组,我们很容易想到的做法是将数组中的元素进行排列,如何区分已选中和未选中的元素,容易想到的是建立一个标记数组,已经选中的元素标记为true,这里采用了另一种做法,采用first这一个常量指针,将数组分割为,为选中元素的数组,和已选中元素的数组,
然后就是排序问题,在backtrack函数里有一个for循环,通过指针i来遍历未选中数组中的元素,得到所有可能的组合
代码
class Solution {
public:
void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len)
{
if (first == len)//终止条件
{
res.push_back(output);
return;
}
for (int i = first; i < len; i++)//这里for循环里的i,作用是遍历未选定数组中的元素,在往下递归时,每次都开始
{//这样一个循环,用来遍历这些元素
swap(output[i], output[first]);
//交换未选中元素的第一个i和我们需要交换的的元素first
backtrack(res, output, first + 1, len);//这里的first+1代表我们已经填了一个数字,
swap(output[i], output[first]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
//所谓回溯就是暴力搜索,通过搜索所有可能的解,得出满足条件的解
vector<vector<int>>res;
backtrack(res, nums, 0, (int)nums.size());
return res;
}
};