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;
    }
};

2.回溯算法-无重复数字的全排列

上一篇:Java中异常的概念和分类


下一篇:C/C++判断某张jpg图片是否完整