穷举 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();
        }
    }
};
相关推荐
君义_noip2 小时前
信息学奥赛一本通 1661:有趣的数列 | 洛谷 P3200 [HNOI2009] 有趣的数列
c++·算法·组合数学·信息学奥赛·csp-s
leaves falling2 小时前
C语言内存函数-
c语言·开发语言
程序员:钧念2 小时前
深度学习与强化学习的区别
人工智能·python·深度学习·算法·transformer·rag
leaves falling2 小时前
c语言-扫雷游戏
c语言·单片机·游戏
英英_3 小时前
MATLAB数值计算基础教程
数据结构·算法·matlab
一起养小猫3 小时前
LeetCode100天Day14-轮转数组与买卖股票最佳时机
算法·leetcode·职场和发展
至为芯4 小时前
IP6537至为芯支持双C口快充输出的45W降压SOC芯片
c语言·开发语言
hele_two4 小时前
快速幂算法
c++·python·算法
OopspoO4 小时前
C++杂记——Name Mangling
c++
yuanmenghao4 小时前
车载Linux 系统问题定位方法论与实战系列 - 车载 Linux 平台问题定位规范
linux·运维·服务器·网络·c++