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

2021/8/22 20:06:26

本文主要是介绍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.回溯算法-无重复数字的全排列的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程