穷举 VS 暴搜 VS 深搜 VS 回溯 VS 剪枝

一:全排列

1.1题目

题目链接:https://leetcode.cn/problems/permutations/description/


1.2算法原理


1.3代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> ret;
    vector<int> path;
    bool check[7] = {false};//用来判断这个下标所对应的数字是否已经使用了
    vector<vector<int>> permute(vector<int>& nums) 
    {
        dfs(nums);
        return ret;
    }

    void dfs(vector<int>& nums)
    {
        if(path.size() == nums.size())
        {
            ret.push_back(path);
            return;
        }

        for(int i = 0; i < nums.size();i++)
        {
            if(!check[i])
            {
                path.push_back(nums[i]);
                check[i] = true;
                dfs(nums);
                //回溯:恢复现场
                path.pop_back();
                check[i] = false;
            }
        }
    }
};

二:子集

2.1题目

题目链接:https://leetcode.cn/problems/subsets/description/


2.2算法原理


2.3代码

解法一:pos位置的数字是选还是不选

cpp 复制代码
class Solution {
public:
    vector<vector<int>> ret = {};
    vector<int> path;
    vector<vector<int>> subsets(vector<int>& nums) 
    {
        dfs(nums,0);
        return ret;
    }

    void dfs(vector<int>& nums,int pos)
    {
        if(pos == nums.size())
        {
            ret.push_back(path);
            return;
        }

        //选pos位置的数字
        path.push_back(nums[pos]);
        dfs(nums,pos+1);
        path.pop_back();

        //不选pos位置的数字
        dfs(nums,pos+1);
    }
};

解法二:只选择pos及之后的数字

cpp 复制代码
class Solution {
public:
    vector<vector<int>> ret;
    vector<int> path;
    vector<vector<int>> subsets(vector<int>& nums) 
    {
        dfs(nums,0);
        return ret;
    }

    void dfs(vector<int>& nums,int pos)
    {
        ret.push_back(path);

        for(int i = pos;i < nums.size();i++)
        {
            path.push_back(nums[i]);
            dfs(nums,i+1);
            path.pop_back();
        }
    }
};
相关推荐
为啥全要学10 小时前
PyTorch 中网络剪枝、梯度剪裁、梯度累积
网络·pytorch·剪枝
驭渊的小故事10 小时前
牛客网算法刷题笔记:哈希表、贪心与动态规划实战
笔记·算法·散列表
2601_9622186110 小时前
C++ AVL树概念与实现详解
开发语言·c++
炘爚10 小时前
C++(STL)
开发语言·c++
careathers10 小时前
【数据结构】二叉树
数据结构·算法
2601_9622186110 小时前
C++ string 类原理、踩坑与对象语义详解
开发语言·c++
爱写代码的小朋友11 小时前
Windows 下 MSYS2 + MinGW64 安装与使用 OpenCV 全指南(含踩坑记录)
c++·人工智能·windows·opencv
重生之小比特11 小时前
【C++进阶】封装红⿊树实现mymap和myset
开发语言·c++
Omics Pro11 小时前
空间组学!医学代谢显微工具
数据库·人工智能·算法·机器学习·自然语言处理
YYYing.11 小时前
【设计模式系列 (四) 】建造者模式
c++·后端·设计模式·建造者模式·c/c++