力扣HOT100之回溯:46. 全排列
之前刷代码随想录的时候做过这道题,现在忘得干干净净了,无语(ˉ▽ˉ;)…,看了下之前关于这道题的思路,写的还是比较简单,主要是基于卡尔的视频来写的,没看过视频的话看那篇博客有点费劲。这次就重新写一下。
这道题要求全排列,那么所有符合条件的排列各自存入一个一维数组,所有存储排列结果的一维数组存放到一个二维数组中,最终将二维数组返回。我们考虑定义一个全局变量path
来收获不同的结果,直接额外定义一个回溯函数backtracking()
,该函数接收两个参数,一个是包含所有元素的数组nums
,另一个是已使用的元素数组used
由于回溯函数肯定是递归函数,我们需要先明确递归的终止条件,当path.size() == nums.size()
时说明所有元素全都用上了,此时我们将path
添加到result
中并直接退出函数,否则我们进入递归主体,在主体中,我们遍历nums
中的所有元素,并检查当前遍历到的元素nums[i]
是否已被使用,如果被使用,就直接跳过本轮循环,如果没使用过,就将nums[i]
添加到path
中,并且将used[i]
设置为true
。然后我们递归调用backtracking()
获取下一层的排列,当递归调用结束后,需要及时回退,将nums[i]
从path
中弹出,并及时将used[i]
标记回false
。
class Solution {
public:vector<vector<int>> result; //存放所有排列结果vector<int> path; //用于记录各种不同的排列结果vector<vector<int>> permute(vector<int>& nums) {vector<bool> used(nums.size(), false); //用于标记对应的元素是否已经被使用backtracking(nums, used);return result;}//回溯递归函数void backtracking(vector<int>& nums, vector<bool>& used){//递归终止条件if(path.size() == nums.size()){result.emplace_back(path);return ;}for(int i = 0; i < nums.size(); i++){if(used[i]) continue; //遇到已经使用过的元素,直接跳过path.emplace_back(nums[i]);used[i] = true;backtracking(nums, used);used[i] = false;path.pop_back();}}
};