1. 程式人生 > 其它 >2.回溯演算法-無重複數字的全排列

2.回溯演算法-無重複數字的全排列

無重複數字的全排列

思路:回溯演算法進行遍歷,採用vis陣列記錄訪問情況,防止後續加入的元素與之前的元素重複,當遍歷到陣列末尾時,加入新的排列到最終結果中。

輸入:[1,2,3]
輸出:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]

                 初始
          /       |      \
         1        2       3
        /  \     /  \    /  \
       2   3     1   3   1   2
       |   |     |   |   |   |
       3   2     3   1   2   1

程式碼

class Solution {
private:
    vector<int> perm;
    vector<vector<int>> ans;
    vector<bool> vis; 
public:
    void backtrac(vector<int>& nums, int index){
        if(index == nums.size()){
            ans.push_back(perm);
            return;
        }

        for(int i = 0; i < nums.size(); i++){
            if(vis[i]){
                continue;
            }
            vis[i] = true;
            perm.push_back(nums[i]);
            backtrac(nums, index + 1);
            vis[i] = false;
            perm.pop_back();
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        int n = nums.size();
        vis.resize(n,0);
        backtrac(nums, 0);
        return ans;
    }
};