視頻講解: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;}
};