C++ DFS

 子集

78. 子集

 法一:思路对每个元素进行选与不选的  选择,这样正好到最后一层 就是2的size()次方个,叶子就是节点,通过pos来控制深度

 

法二:通过for循环实现,且下一个栈帧的i是上一个栈帧当前元素的下一个位置 ,能起到vis的作用刚开始写的时候把这个->dfs(nums, i + 1); 写成了dfs(nums, pos + 1);

 

解释为什么dfs(nums, pos + 1);是错的且当样例为[1,2,3]时有16个结果 

其实就是逻辑上不对,每一个for循环进到下一个栈帧的区间都是一样的,这就是问题所在;

总结:在for里i=pos上,有一点点语法的混淆,加上脑子不清醒,逻辑不清晰,梳理好了在写,不然还得重新检查

法一:

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;}path.push_back(nums[pos]);dfs(nums, pos + 1);path.pop_back();dfs(nums,pos + 1);}
};

法二: 

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

全排列 

 46. 全排列

 通过pos来控制栈帧深度,pos+1来增加深度,pos也是用来取值的

在代码上表现逻辑:当需要dfs往下走的时候,需要对已经当前元素改bool值,来保证到下一层不被使用;当dfs回来之后自然的要把当前元素弹出path(其实每个栈的深度,就是这个元素在path里的位置)我们只需要弹出它,让他去后面的其他位置,同时需要解锁bool值

题外话:保持其他代码不变,删掉弹出语句,最大长度是多少?

答:15个,第一个栈帧可以发送3个值,同时需要三个栈帧(注意:在此时深度仍然是2),这三个栈帧每个可以向下个栈帧发送2个值,会有6个栈帧;这6个栈帧每个可以发送一个值,那就是2+3*2+6=15,一共会创建16个栈帧(因为到进不去for那个栈帧才结束),最大深度为4

 

class Solution {
public:vector<vector<int>> ret;vector<int> path;vector<bool> vis;//bool[6];vector<vector<int>> permute(vector<int>& nums) {vis.resize(nums.size());dfs(nums, 0);return ret;}void dfs(vector<int>& nums, int pos){if(pos == nums.size()){ret.push_back(path);return;}for(int i = 0; i < nums.size(); i++){if(vis[i] == true) continue;path.push_back(nums[i]);vis[i] = true;dfs(nums, pos + 1);path.pop_back();vis[i] = false;}}
};

 找出所有子集的异或总和再求和

1863. 找出所有子集的异或总和再求和

 

class Solution {
public:int ret = 0;int subsetXORSum(vector<int>& nums) {dfs(nums, 0, 0);return ret;}void dfs(vector<int>& nums, int pos, int sum){ret += sum;for(int i = pos; i < nums.size(); i++){sum = sum ^ nums[i];dfs(nums, i + 1, sum);sum ^= nums[i];}}
};

全排列 II 

 47. 全排列 II

1. 去重想到的就是set,set里放vector<int>

2. 剪枝

class Solution {
public:set<vector<int>> set;vector<bool> vis;vector<int> path;vector<vector<int>> permuteUnique(vector<int>& nums) {vis.resize(nums.size());dfs(nums, 0);vector<vector<int>> ret(set.begin(), set.end());return ret;}void dfs(vector<int>& nums, int pos){if(path.size() == nums.size()){set.insert(path);}for(int i = 0; i < nums.size(); i++){if(vis[i]) continue;path.push_back(nums[i]);vis[i] = true;dfs(nums, pos + 1);vis[i] = false;path.pop_back();}}
};
class Solution {
public:vector<bool> vis;vector<int> path;vector<vector<int>> ret;vector<vector<int>> permuteUnique(vector<int>& nums) {vis.resize(nums.size());sort(nums.begin(), nums.end());dfs(nums, 0);return ret;}void dfs(vector<int>& nums, int pos){if(pos == nums.size()){ret.push_back(path);return;}for(int i = 0; i < nums.size(); i++){if(vis[i] == true || i != 0 && nums[i] == nums[i - 1] && vis[i - 1] == false) continue;path.push_back(nums[i]);vis[i] = true;dfs(nums, pos + 1);path.pop_back();vis[i] = false;}}
};

 电话号码的字母组合

 17. 电话号码的字母组合

 代码问题:arr[digits[pos] - '0'];忘记是字符了

逻辑问题:digiis可能是空串,空串进入dfs就会被压入 "" 空字符串

class Solution {
public:vector<string> arr{ "","","abc","def" ,"ghi","jkl","mno","pqrs","tuv","wxyz"};vector<string> ret;string path;vector<string> letterCombinations(string digits) {if(digits.size() == 0) return ret;dfs(digits, 0);return ret;}void dfs(string digits, int pos){if (pos == digits.size()){ret.push_back(path);return;}string tmp = arr[digits[pos] - '0'];for (auto e : tmp){path.push_back(e);dfs(digits, pos + 1);path.pop_back();}}
};

 组合

77. 组合

 

class Solution {
public:vector<int> path;vector<bool> vis;vector<vector<int>> ret;int _k;vector<vector<int>> combine(int n, int k) {_k = k;vector<int> arr(n);for (int i = 0; i < n; i++)arr[i] = i + 1;dfs(arr, 0);return ret;}void dfs(vector<int>& arr, int pos){if (path.size() == _k){ret.push_back(path);return;}for (int i = pos; i < arr.size(); i++){path.push_back(arr[i]);dfs(arr, i + 1);path.pop_back();}}
};
class Solution {
public:vector<int> path;vector<vector<int>> ret;int _k, _n;vector<vector<int>> combine(int n, int k) {_k = k;_n = n;dfs(0);return ret;}void dfs(int pos){if (path.size() == _k){ret.push_back(path);return;}for (int i = pos; i < _n; i++){path.push_back(i + 1);dfs(i + 1);path.pop_back();}}
};

 目标和

 494. 目标和

 

 发现局部sum不需要sum += nums[pos];这样的加回去的操作,因为每一个栈帧里的sum都是不一样的,而全局sum会一直改变,一个栈帧里的操作不能影响同层栈帧

 全局sum

class Solution {
public:int sum = 0, ret = 0,_target;int findTargetSumWays(vector<int>& nums, int target) {_target = target;dfs(nums, 0);return ret;}void dfs(vector<int>& nums, int pos){if (pos == nums.size()){if (_target == sum)ret++;return;}sum += nums[pos];dfs(nums, pos + 1);sum -= nums[pos];sum -= nums[pos];dfs(nums, pos + 1);sum += nums[pos];}
};

局部sum 

class Solution {
public:int ret = 0,_target;int findTargetSumWays(vector<int>& nums, int target) {_target = target;dfs(nums, 0, 0);return ret;}void dfs(vector<int>& nums, int pos, int sum){if (pos == nums.size()){if (_target == sum)ret++;return;}sum += nums[pos];dfs(nums, pos + 1, sum);sum -= nums[pos];sum -= nums[pos];dfs(nums, pos + 1, sum);}
};

 组合总和

 39. 组合总和

 参开代码

class Solution {
public:vector<int> path;int _target;vector<vector<int>> ret;vector<vector<int>> combinationSum(vector<int>& candidates, int target) {_target = target;dfs(candidates, 0, 0);return ret;}void dfs(vector<int>& nums, int pos, int sum){if(sum == _target){ret.push_back(path);return;}if(sum > _target || pos == nums.size()) return;for(int i = 0; i * nums[pos] + sum <= _target; i++){if(i) path.push_back(nums[pos]);dfs(nums, pos + 1, i * nums[pos] + sum);// while(i--)//     path.pop_back();    //不对必须是整个for结束,不然i走不下去了}for(int i = 1; i * nums[pos] + sum <= _target; i++) path.pop_back();}
};

 超时:

class Solution {
public://vector<vector<int>> ret;int _target, sum = 0;vector<int> path;set<vector<int>> set;vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<int> nums;for (auto e : candidates){int n = target / e;for (int i = 0; i < n; i++)nums.push_back(e);}_target = target;dfs(nums, 0);vector<vector<int>> ret(set.begin(), set.end());return ret;}void dfs(vector<int>& nums, int pos){if(sum == _target)set.insert(path);if (pos == nums.size()) return;for (int i = pos; i < nums.size(); i++){path.push_back(nums[i]);sum += nums[i];dfs(nums, i + 1);sum -= nums[i];path.pop_back();}}
};

 括号生成

22. 括号生成

 条件约束递归

class Solution {
public:string path;vector<string> ret;int _n, left = 0, right = 0;vector<string> generateParenthesis(int n) {_n = n;dfs();return ret;}void dfs(){if(right == _n) {ret.push_back(path);return;}if (left < _n){path.push_back('(');left++, dfs();path.pop_back(); left--;}if (right < left){path.push_back(')');right++, dfs();path.pop_back(); right--;}}};

判断是不是平衡二叉树 

判断是不是平衡二叉树_牛客题霸_牛客网

dfs的返回值 :-1为false 非0为高度差,这个想法很6★★★★ 

left和right是不用+1的,因为这个1是root这个位置

class Solution {
public:bool IsBalanced_Solution(TreeNode* pRoot) {return dfs(pRoot) != -1;}int dfs(TreeNode* root){if (root == nullptr) return 0;int left = dfs(root->left);if (left == -1) return -1;int right = dfs(root->right);if (right == -1) return -1;return abs(left - right) <= 1 ? max(left, right) + 1: -1;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/344240.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【上篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史

YOLO 型号之所以闻名遐迩,主要有两个原因:其速度和准确性令人印象深刻,而且能够快速、可靠地检测图像中的物体。 在本文中,我将与大家分享我在阅读一篇长达 30 页的综合性论文时获得的见解,该论文深入探讨了 YOLO 模型的进步。 这篇评论全面概述了 YOLO 框架的演变过程,…

PDF转图片工具

背景&#xff1a; 今天有个朋友找我&#xff1a;“我有个文件需要更改&#xff0c;但是文档是PDF的&#xff0c;需要你帮我改下内容&#xff0c;你是搞软件的&#xff0c;这个对你应该是轻车熟路了吧&#xff0c;帮我弄弄吧”&#xff0c;听到这话我本想反驳&#xff0c;我是开…

PVE管理虚拟机节点

今天使用PVE命令安装虚拟机。 ‍ 查看所有虚拟机 qm list 查看所有虚拟机 ​​ 创建虚拟机 qm create 创建虚拟机 qm create 106 --name vm-test --memory 2048 --net0 virtio,bridgevmbr0基础配置 这条命令会创建一个 VM&#xff0c;ID 为 106​&#xff0c;名称为 myvm​…

Huawei 大型 WLAN 组网 AC 间漫游

AC1配置命令 <AC6005>display current-configuration # vlan batch 100 # interface Vlanif100description to_S3_CAPWAPip address 10.0.100.254 255.255.255.0 # interface GigabitEthernet0/0/1port link-type trunkport trunk allow-pass vlan 100# ip route-stati…

前端开发高频面试题

好的&#xff0c;以下是对您提出的问题的详细回答&#xff1a; 说说vue动态权限绑定渲染列表&#xff08;权限列表渲染&#xff09; Vue中动态权限绑定渲染列表通常涉及以下步骤&#xff1a; 首先&#xff0c;通过API请求从服务器获取当前用户的权限数据。在Vue组件中&#xff…

UR机器人通信汇总

文章目录 一、概述二、UR机器人通信2.1UR通信协议2.2 UR通信端口 三、UR机器人通信端口类型3.1 Modbus TCP端口&#xff08;502端口&#xff09;3.2 Dashboard端口&#xff08;29999端口&#xff09;3.3 上位机编程端口&#xff08;30001/30002/30003端口&#xff09;3.3.1 URS…

vivado HW_BITSTREAM、HW_CFGMEM

HW_比特流 描述 从比特流文件创建的硬件比特流对象hw_bitstream&#xff0c;用于关联 在Vivado的硬件管理器功能中使用硬件设备对象hw_device 设计套件。 比特流文件是从具有write_bitstream的放置和路由设计创建的 命令硬件位流对象是使用 create_hw_bitstream命令&#xff0c…

概率论与数理统计,重要知识点——全部公式总结

二、一维随机变量及其分布 五个分布参考另外一篇文章 四、随机变量的数字特征 大数定理以及中心极限定理 六、数理统计

【iOS】UI——关于UIAlertController类(警告对话框)

目录 前言关于UIAlertController具体操作及代码实现总结 前言 在UI的警告对话框的学习中&#xff0c;我们发现UIAlertView在iOS 9中已经被废弃&#xff0c;我们找到UIAlertController来代替UIAlertView实现弹出框的功能&#xff0c;从而有了这篇关于UIAlertController的学习笔记…

【数据结构】六种排序实现方法及区分比较

文章目录 前言插入排序希尔排序选择排序堆排序快速排序冒泡排序总结 前言 众所周知&#xff0c;存在许多种排序方法&#xff0c;作为新手&#xff0c;最新接触到的就是冒泡排序&#xff0c;这种排序方法具有较好的教学意义&#xff0c;但是实用意义不高&#xff0c;原因就在于…

用互斥锁解决缓存击穿

我先说一下正常的业务流程&#xff1a;需要查询店铺数据&#xff0c;我们会先从redis中查询&#xff0c;判断是否能命中&#xff0c;若命中说明redis中有需要的数据就直接返回&#xff1b;没有命中就需要去mysql数据库查询&#xff0c;在数据库中查到了就返回数据并把该数据存入…

【Ardiuno】实验使用ESP32连接Wifi(图文)

ESP32最为精华和有特色的地方当然是wifi连接&#xff0c;这里我们就写程序实验一下适使用ESP32主板连接wifi&#xff0c;为了简化实验我们这里只做了连接部分&#xff0c;其他实验在后续再继续。 由于本实验只要在串口监视器中查看结果状态即可&#xff0c;因此电路板上无需连…

FFmpeg播放器的相关概念【1】

播放器框架 相关术语 •容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如mp4、flv、mkv等。 • 媒体流&#xff08;Stream&#xff09;&#xff1a;表示时间轴上的一段连续数据&#xff0c;如一段声音数据、一段…

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP

【数据结构】初识数据结构之复杂度与链表

【数据结构】初识数据结构之复杂度与链表 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【数据结构】初识数据结构之复杂度与链表前言一.数据结构和算法1.1数据结构1.2算法1.3数据结构和算法的重要性 二.时间与空间…

【计算机毕业设计】基于SSM++jsp的在线医疗服务系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

Ubuntu server 24.04 (Linux) 搭建DNS服务器 通过Nginx实现UDP/TCP负载均衡 轻量级dnsmasq服务器

一 系统运行环境 testtest:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04 LTS (Noble Numbat)" VERSION_CODENAMEnoble IDubuntu ID_LIKEdebian HOME_URL"https://www.…

国际货币基金组织警告:网络攻击影响全球金融稳定

近日&#xff0c;在一份关于金融稳定的报告中&#xff0c;国际货币基金组织&#xff08;IMF&#xff09;用了一章&#xff08;共三章&#xff09;的篇幅描述了网络攻击对金融环境的影响&#xff0c;并警告称&#xff0c;全球金融稳定正受到日益频繁和复杂的网络攻击的威胁。同时…

Python的登录注册界面跳转汽车主页面

1.登录注册界面的代码&#xff1a; import tkinter as tk from tkinter import messagebox,ttk from tkinter import simpledialog from ui.car_ui import start_car_ui# 设置主题风格 style ttk.Style() style.theme_use("default") # 可以根据需要选择不同的主题…

你可以直接和数据库对话了!DB-GPT 用LLM定义数据库下一代交互方式,数据库领域的GPT、开启数据3.0 时代

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 你可以直接和数据库对话了&#xff01;DB-GPT 用LLM定义数据库下一代交互方式&#xff0c;数据库领…