【代码随想录day 25】 力扣 46. 全排列
视频讲解:https://www.bilibili.com/video/BV19v4y1S79W/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html#%E6%80%9D%E8%B7%AF
力扣题目:https://leetcode.cn/problems/permutations/
这道题还是比较简单的,相较于之前的题来说,这道题的一大特点就是树枝去重,之前的都是树层去重,所谓树枝去重,就是我们在一条遍历过程中,本身的元素的二次遍历不需要,比如第一次选择2,剩下13,下一次遍历我需要从1开始,但是不想要2怎么办,就要进行树枝去重,我们还是借用之前树层去重的方式used,如果一条遍历过程中,元素等于ture就说明已经选择过了,直接continue下一个即可。
class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(vector<int> &nums, int startIndex, vector<bool> &used){//判断终止条件if(path.size() == nums.size()){result.push_back(path);return;}//单层搜索for(int i = startIndex; i < nums.size(); i++){if(used[i] == true){continue;}//存入path元素path.push_back(nums[i]);//更新usedused[i] = true;//回溯--需要从头回溯backtracking(nums, 0, used);//回溯path.pop_back();used[i] = false;}return;}
public:vector<vector<int>> permute(vector<int>& nums) {result.clear();path.clear();vector<bool> used(nums.size(), false);backtracking(nums, 0, used);return result;}
};