穷举 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();
        }
    }
};
相关推荐
李兆龙的博客3 小时前
从一到无穷大 #57:Snowflake的剪枝方案
算法·剪枝
yolo_guo3 小时前
opencv 学习: QA_02 什么是图像中的高频成分和低频成分
linux·c++·opencv·计算机视觉
啊我不会诶3 小时前
01BFS学习笔记
笔记·学习·算法
Ch_ty3 小时前
leetcode解题思路分析(一百六十八)1452 - 1458 题
算法·leetcode·哈希算法
哼?~3 小时前
算法学习--离散化
算法
红豆诗人3 小时前
C语言进阶知识--文件操作
c语言·开发语言·文件操作
AI科技星3 小时前
引力编程时代:人类文明存续与升维
数据结构·人工智能·经验分享·算法·计算机视觉
2301_803554524 小时前
socket编程
c++
热爱编程的OP4 小时前
Linux进程池与管道通信详解:从原理到实现
linux·开发语言·c++