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

hot100 -- 回溯(上)

目录

🍞科普

🌼全排列

AC  DFS

🚩子集

AC  DFS

🎂电话号码的字母组合

AC  DFS

🌼组合总和

AC  DFS


🍞科普

忘记 dfs 的,先看看这个👇

DFS(深度优先搜索)8种题型_dfs典型问题-CSDN博客

🌼全排列

46. 全排列 - 力扣(LeetCode)

AC  DFS

排列型枚举哦~

vector 中 push_back 和 [] 下标访问是不一样的

push_back() 是往末尾加入元素,vector 大小会自动增加

而 [] 是直接改变 vector 某个位置的元素

如果你先 ret[i] = count[i]; 然后 ret.pop_back(); 多次循环后,vector 为空,此时再访问就会报错空指针 Null Pointer 错误

时间 O(n * !n),空间 O(n)

class Solution {
private:vector<vector<int>> ans;vector<int> ret; // 临时答案bool vis[7]; // 标记数组--需要回溯void dfs(vector<int>& nums, int count) {int n = nums.size();// 递归出口if (count == n) {ans.push_back(ret);return;}// 遍历每个位置for (int i = 0; i < n; ++i) {if (vis[i] == 0) {ret.push_back(nums[i]); // 加入答案数组vis[i] = 1; // 标记dfs(nums, count + 1); // 递归vis[i] = 0; // 取消标记ret.pop_back(); // 取消标记}}}public:vector<vector<int>> permute(vector<int>& nums) {\dfs(nums, 0);return ans;}};

🚩子集

78. 子集 - 力扣(LeetCode)

指数型枚举哦~

AC  DFS

只有 选 / 不选 两种

时间 O(n * 2^n),空间 O(n)

class Solution {
private:vector<vector<int>> ans;vector<int> ret; // 临时答案
public:void dfs(vector<int>& nums, int count) {int n = nums.size();// 递归出口if (count == n) {ans.push_back(ret);return;}// 选 OR 不选// 选ret.push_back(nums[count]); // 类似标记dfs(nums, count + 1); // 递归ret.pop_back(); // 类似取消标记// 不选dfs(nums, count + 1);}vector<vector<int>> subsets(vector<int>& nums) {dfs(nums, 0);return ans;}
};

🎂电话号码的字母组合

17. 电话号码的字母组合 - 力扣(LeetCode)

AC  DFS

空数组是 {},而不是 [],编译器看不懂这种 lambda 表达式

本题不要标记,因为,比如 "222",是可以取 "aaa" 的 

3 个字母的数字输入 m 个,4 个字母的输入 n 个

时间 O(3^m * 4^n) -- 遍历每一种字母组合

/*
1)  n 个数字, 每个数字取 1 个字母, 共取出 n 个字母
2) 取出的 n 个字母,按顺序组合起来 -- O(1)
*/
class Solution {
private:string ret; // 临时答案vector<string> ans;string num_alpha[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};// 已选 count 个数字void dfs(string digits, int count) {int n = digits.size();if (count == n) {ans.push_back(ret);return;}int num = digits[count] - '0'; // 当前数字string now = num_alpha[num]; // 当前字符串// 取一个字母for (int i = 0; i < now.size(); ++i) {ret.push_back(now[i]); // 插入字母dfs(digits, count + 1); // 递归ret.pop_back(); // 回溯时,便于填充其他字母}}public:vector<string> letterCombinations(string digits) {// 特判空字符串, 返回空数组, 而不是包含空字符串的数组 [""]if (digits == "")return {};dfs(digits, 0);return ans;}
};

🌼组合总和

39. 组合总和 - 力扣(LeetCode)

AC  DFS

1)指数型枚举的前提下,一个数字可以 “无限制重复” 被选取

2)还要考虑到,这题是 组合 问题,相同组合不同排列,视为同一种结果

3)分两种情况讨论,选 / 不选,注意参数的不同

class Solution {
private:vector<vector<int>> ans;vector<int> ret; // 临时答案// num - candidates[i], num == 0 得到一个结果// 剩余 num, 第 start 个数字void dfs(vector<int>& candidates, int num, int start) {int n = candidates.size();// 递归出口if (start >= n) return;// 一种结果if (num == 0) {ans.push_back(ret);return;}// 选(当前数字)// 不超过 targetif (num - candidates[start] >= 0) {ret.push_back(candidates[start]);dfs(candidates, num - candidates[start], start); // 选当前数字ret.pop_back(); // 恢复现场}// 不选(当前数字)dfs(candidates, num, start + 1); // 递归下一个}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {dfs(candidates, target, 0); // 剩余 target, 第 0 个数字开始return ans;}
};

相关文章:

  • 利用Python去除PDF水印
  • 前端基础入门三大核心之HTML篇:深入理解重绘与重排 —— 概念、区别与实战演练
  • vue 纵向滚动菜单, 点击滚动到选中菜单
  • 【项目托管git】本地项目托管到 Gitee
  • 机器学习-决策树算法
  • IDEA连接MySQL后如何管理数据库
  • JavaSE——类和对象(二)~~封装
  • 光耦合器的特性和应用概述
  • Mac电脑太卡了怎么办 Mac电脑常见问题 cleanmymacX有必要买吗
  • tensorflow下载
  • 编一个自己的万年历
  • 接口使用实例——数组排序
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • Android Audio基础——AudioFlinger回放录制线程(七)
  • 【NUCLEO-G071RB】007——IWDG-喂狗
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • IP路由与转发
  • Java到底能干嘛?
  • nginx 负载服务器优化
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 简单数学运算程序(不定期更新)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 模型微调
  • 数据仓库的几种建模方法
  • 我感觉这是史上最牛的防sql注入方法类
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • $NOIp2018$劝退记
  • %check_box% in rails :coditions={:has_many , :through}
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Oracle)SQL优化技巧(一):分页查询
  • (二)正点原子I.MX6ULL u-boot移植
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十) 初识 Docker file
  • (十七)、Mac 安装k8s
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)Linux下编译安装log4cxx
  • ***详解账号泄露:全球约1亿用户已泄露
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .Family_物联网
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 反射的使用
  • .Net多线程总结
  • .net反混淆脱壳工具de4dot的使用
  • .Net下的签名与混淆