回溯法 总结

1.全排列(leetcode 46)

  •  分析:

对[1,2,3]进行全排列={取出其中一个数字}+对剩余的数字进行全排列,这也就是递归操作。

  • 实现: 
class Solution {
public:
    vector<vector<int>> res;
    vector<bool> used;
    //
    void permute(vector<int>&nums,int index,vector<int>&ans)
    {
        if(index==nums.size())
        {
            res.push_back(ans);
            return;
        }
            
        for(int i=0;i<nums.size();i++)
        {

            ans.push_back(nums[i]);
            permute(nums,index+1,ans);
            //回溯操作
            ans.pop_back();
        }
        return;
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<int> ans;
        permute(nums,0,ans);
        return res;

    }
};

结果: [[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3],[1,3,1],[1,3,2],[1,3,3],[2,1,1],[2,1,2],[2,1,3],[2,2,1],[2,2,2],[2,2,3],[2,3,1],[2,3,2],[2,3,3],[3,1,1],[3,1,2],[3,1,3],[3,2,1],[3,2,2],[3,2,3],[3,3,1],[3,3,2],[3,3,3]]

class Solution {
public:
    vector<vector<int>> res;
    vector<bool> used;
    void permute(vector<int>&nums,int index,vector<int>&ans)
    {
        if(index==nums.size())
        {
            res.push_back(ans);
            return;
        }
            
        for(int i=0;i<nums.size();i++)
        {
            if(!used[i])
            {
                ans.push_back(nums[i]);
                used[i]=true;
                permute(nums,index+1,ans);
                //当递归到底时,需要把插入的元素退出,状态恢复原样
                ans.pop_back();
                used[i]=false;
            }

        }
        return;
    }
    vector<vector<int>> permute(vector<int>& nums) {
        //状态变量,判断是否被使用
        used=vector<bool>(nums.size(),false);
        vector<int> ans;
        permute(nums,0,ans);
        return res;

    }
};

 结果:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

发布了49 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/He3he3he/article/details/105089208