当前位置: 首页 > news >正文

【递归、搜索和回溯】穷举vs暴搜vs深搜vs回溯vs剪枝

个人主页 : zxctscl
专栏 【C++】、 【C语言】、 【Linux】、 【数据结构】、 【算法】
如有转载请先通知

文章目录

  • 前言
  • 1 46. 全排列
    • 1.1 分析
    • 1.2 代码
  • 2 78. 子集
    • 2.1 分析
    • 2.2 代码

前言

之前提到递归、搜索和回溯介绍: 【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题,继续来看着类型的题目

1 46. 全排列

在这里插入图片描述

1.1 分析

穷举也就是枚举

  1. 画决策树:越详细越好
    当情况不符合的时候就剪枝

在这里插入图片描述

  1. 设计代码
    (1)全局变量
    需要记录的东西
    二维数组int[][] ret来记录结果,用int[] path记录路径

用一个布尔类型数组bool[] check,来判断这个路径下标对应的数是否使用过,就实现了剪枝。
枚举1的时候在check里面查看是否已经用了,

(2)dfs函数
仅需关心,每一个节点该干什么事情。

细节:
回溯:(1)path向上走的时候,减掉最后一个元素;(2)path去掉最后一个元素时候,最后一个元素把check修改为flase
剪枝:check实现
递归出口:遇到叶子结点,直接添加结果。

1.2 代码

class Solution {vector<vector<int>> ret;vector<int> path;bool check[7];
public:vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}void dfs(vector<int>& nums){if(nums.size()==path.size()){ret.push_back(path);return;}for(int i=0;i<nums.size();i++){if(check[i]==false){path.push_back(nums[i]);check[i]=true;dfs(nums);//恢复现场path.pop_back();check[i]=false;}}}
};

2 78. 子集

在这里插入图片描述

2.1 分析

解法一:

  1. 决策树
    ×表示不选,√表示选
    在这里插入图片描述

  2. 设计代码
    全局变量:(1)用int[] path来记录路径2)用int[][] ret存放最终结果

dfs函数:
dfs(nums,i)传入数组,i位置选还是不选;
选:path±nums[i];再去下一层dfs(nums,i+1)
不选:直接去下一层dfs(nums,i+1)

细节问题:
剪枝
回溯:在选择到时候path-=nums[i]
递归出口:到叶子结点时候i==nums.size()
在这里插入图片描述

解法二:

  1. 决策树
    看子集元素个数,要么0个,要么一个,要么两个,只从元素后面开始选择
    刚开始就是空集
    一个元素有:1,2,3
    两个元素,再一个元素基础上添加一个
    三个元素,再两个元素基础上添加一个
    在这里插入图片描述

  2. 设计代码
    全局变量:(1)用int[] path来记录路径 (2)用int[][] ret存放最终结果

dfs函数:
dfs(nums,pos)从pos位置开始;

for(i=pos;i<nums.size();i++)
{path+nums[pos];dfs(nums,i+1);path-最后一个元素}

细节问题:
剪枝
回溯:
递归出口:没有递归出口

2.2 代码

解法一:

class Solution {vector<vector<int>> ret;vector<int> path;
public: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;}//选path.push_back(nums[pos]);dfs(nums,pos+1);path.pop_back();//不选dfs(nums,pos+1);}
};

解法二:

class Solution {vector<vector<int>> ret;vector<int> path;
public: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();}}
};

有问题请指出,大家一起进步!!!

相关文章:

  • (独家)SAP CO模块中 销售发票对应的Cost Document中的PSG对象是什么东东??
  • 网站漏洞存在哪些危害,该如何做好预防?
  • SQL练习——day01
  • 告别碎片化!MCP 带来 AI Agent 开发生态的革命性突破
  • Makefile 详解
  • 电商热销榜的5种实现方案
  • 平替BioLegend品牌-Elabscience PE/Cyanine5.5标记CD11b抗体,高性价比解决方案!
  • MySQL 8.0 OCP 1Z0-908 题目解析(4)
  • 2025 OceanBase 开发者大会全议程指南
  • Console Importer浏览器插件的编译 及 制作成.crx浏览器插件的步骤
  • Trae - 国人Cursor的免费平替产品
  • Unity基础学习(十五)核心系统——音效系统
  • Scratch作品 | 3D原野漫游
  • 数据分析NumPy
  • Modbus转IEC104网关(三格电子)
  • Weblogic SSRF漏洞复现(CVE-2014-4210)【vulhub靶场】
  • docker 学习记录
  • 可解释性AI 综述《Explainable AI for Industrial Fault Diagnosis: A Systematic Review》
  • 【Ansible基础】Ansible 核心组件深度解析:控制节点、受管节点、Inventory与Playbook
  • 表记录的检索
  • 上海高院与上海妇联签协议,建立反家暴常态化联动协作机制
  • 黑龙江省政府副秘书长许振宇,拟任正厅级领导
  • 商务部新闻发言人就出口管制管控名单答记者问
  • 财政部党组召开2025年巡视工作会议暨第一轮巡视动员部署会
  • 马上评丨火车穿村而过多人被撞身亡,亡羊补牢慢不得
  • 李公明谈“全球南方”与美术馆