46. 全排列/C++

在这里插入图片描述
回溯法
典型的树形问题
Perms(nums[0…n-1]) = {取出一个数字} + Perms(nums[{0…n-1} - 这个数字])

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        res.clear();
        if(nums.empty())
            return res;
        
        visit=vector<bool>(nums.size(),false);
        vector<int> pe;
        generatePermute(nums,0,pe);
        
        return res;
    }
private:
    vector<vector<int>> res;
    vector<bool> visit;
    
    //开始处理pe中的第index个元素
    void generatePermute(const vector<int>& nums, int index, vector<int>& pe){
    	//如果pe的长度已经与nums长度相等就说明,pe已经包含所有nums中的元素,因此可以返回了
        if(index == nums.size()){
            res.push_back(pe);
            return;
        }
        
        //pe中的第index个元素可以是nums中所有没有用过的元素,即!visit[i]
        for(int i=0;i<nums.size();++i){
            if(!visit[i]){
                pe.push_back(nums[i]);
                visit[i]=true;
                //处理完pe第index个元素后,开始处理第index+1个元素
                generatePermute(nums,index+1,pe);
                
                pe.pop_back();
                visit[i]=false;
            }
        }    
    }
};

猜你喜欢

转载自blog.csdn.net/Zolewit/article/details/89511516