递归

目录

  • 递归与回溯
    • 递归(Recursive)
    • 回溯 (Backtrack)
  • permutation问题

递归与回溯

递归(Recursive)

程序调用自身的编程技巧称为递归,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

力扣17. 电话号码的字母组合

回溯 (Backtrack)

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
回溯的思路基本如下:当前局面下,我们有若干种选择,所以我们对每一种选择进行尝试。如果发现某种选择违反了某些限定条件,此时 return;如果尝试某种选择到了最后,发现该选择是正确解,那么就将其加入到解集中。
在这种思想下,我们需要清晰的找出三个要素:选择 (Options),限制 (Restraints),结束条件 (Termination)。
回溯是一种算法思想,它是用递归实现的。回溯的过程类似于穷举法,但回溯有“剪枝”功能,即自我判断过程

力扣22. 括号生成

permutation问题

力扣46. 全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

题解参考

  1. 回溯
class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int>vis(nums.size(),0);
        dfs(res,{},nums,vis);
        return res;
    }
    void dfs(vector<vector<int>>& res,vector<int> path,vector<int>& nums,vector<int>& vis){
        if(path.size()==nums.size()){
            res.push_back(path);
            return;
        }
        for(int i=0;i<nums.size();i++){
            if(vis[i]) continue;
            vis[i]=1;
            path.push_back(nums[i]);
            dfs(res,path,nums,vis);
            path.pop_back();
            vis[i]=0;
        }
    }
};
  1. next_permutation库函数
class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int>temp=nums;
        do{
            res.push_back(temp);
            next_permutation(temp.begin(),temp.end());
        }while(temp!=nums);
        return res;
    }
};

————————————————

原文链接:https://blog.csdn.net/ajianyingxiaoqinghan/article/details/79682147

你可能感兴趣的:(数据结构与算法)