leetCode刷题-图、回溯相关

岛屿数量

class Solution {
private:int mi;int mj;
public:int numIslands(vector<vector<char>>& grid) {mi = grid.size() - 1;    // i的范围 0~mimj = grid[0].size() - 1; // j的范围 0~mjint landnum = 0;bool sea = false;do {pair<int, int> res = find_land(grid);if (res.first==-1&&res.second==-1)sea = true;else {landnum++;moveland(grid, res.first, res.second);}}while (!sea) ;return landnum;}pair<int, int> find_land(vector<vector<char>>& grid) {// 找到陆地返回坐标// 没找到返回-1,-1for (int i=0;i<mi+1;i++){for(int j=0;j<mj+1;j++){if(grid[i][j]=='1') {return make_pair(i,j);}}}return make_pair(-1,-1);}void moveland(vector<vector<char>>& grid, int i, int j) {// 将ij连通的全部土地变为水grid[i][j] = '0';if (i - 1 >= 0 && grid[i-1][j]=='1') {moveland(grid, i - 1, j);}if (j - 1 >= 0 && grid[i][j-1]=='1') {moveland(grid, i, j - 1);}if (j + 1 <= mj && grid[i][j+1]=='1') {moveland(grid, i, j + 1);}if (i + 1 <= mi && grid[i+1][j]=='1') {moveland(grid, i+1, j);}return;}
};

橘子腐烂(多源扩散,广度优先)

class Solution {
public:int orangesRotting(vector<vector<int>>& grid) {int min = 0;int res = 0;for(int i=0; i<grid.size();i++){for(int j=0; j<grid[0].size();j++){if(grid[i][j]==2){res = bfs(grid,i,j,0);}}}//检查:如果为1int Max = -1;for(int i=0; i<grid.size();i++){for(int j=0; j<grid[0].size();j++){if(grid[i][j]==1){res = -1;}if(Max < grid[i][j]) Max = grid[i][j];}}if(res!=-1) return max(Max-2, 0);else return -1;}int bfs(vector<vector<int>>& grid, int i, int j, int min){//起始点为:ijqueue<pair<int,int>> bfs_q;int lay1 = 1;int lay2 = 0;int laynum = 1;bfs_q.push(make_pair(i,j));while(!bfs_q.empty()){//出队pair<int,int>point = bfs_q.front();bfs_q.pop();lay1--;//本层--//四个方向只要是好橘子就入队///if(point.first-1>=0 && (grid[point.first-1][point.second]==1 ||grid[point.first-1][point.second] > laynum+2)){grid[point.first-1][point.second]=laynum+2;//腐烂bfs_q.push(make_pair(point.first-1,point.second));lay2++;}if(point.second-1>=0 && (grid[point.first][point.second-1]==1 ||grid[point.first][point.second-1] > laynum+2)){grid[point.first][point.second-1]=laynum+2;bfs_q.push(make_pair(point.first,point.second-1));lay2++;}if(point.first+1<=grid.size()-1 && (grid[point.first+1][point.second]==1 ||grid[point.first+1][point.second] > laynum+2)){grid[point.first+1][point.second]=laynum+2;bfs_q.push(make_pair(point.first+1,point.second));lay2++;}if(point.second+1<=grid[0].size()-1 && (grid[point.first][point.second+1]==1 ||grid[point.first][point.second+1] > laynum+2)){grid[point.first][point.second+1]=laynum+2;bfs_q.push(make_pair(point.first,point.second+1));lay2++;}///if(lay1==0){laynum++;lay1 = lay2;lay2 = 0;}}return laynum-2;}void printgrid(vector<vector<int>>& grid){cout<<"打印图:"<<endl;for(int i=0; i<grid.size();i++){for(int j=0; j<grid[0].size();j++){cout<<grid[i][j]<<" ";}cout<<endl;}}
};

课程表(有向图、拓扑图、判断是否有环) 

全排列(插入法、回溯法)

class Solution {
public:vector<vector<int>> permute(vector<int>& nums) {//全排列queue<vector<int>>q_anss;vector<vector<int>>anss;// for(int num : nums){//     cout<<num;// }// cout<<endl;vector<int>ans = nums;if(nums.size()) q_anss.push(ans);int lay1 = 1;int lay2 = 0;for(int lay = 0; lay < nums.size(); lay++){//lay为确定下标为lay及其之前的元素// cout<<"进入外层循环(下面要固定的下标)lay = "<<lay<<endl;//下面要固定下标为laywhile(lay1){  //在原有的解空间里改动【0~lay】已经确定//取出向量vector<int>out_vec = q_anss.front();// cout<<lay1<<"取出向量:";// for(int num:out_vec) cout<<num<<" ";// cout<<endl;q_anss.pop();lay1--;//加入向量for(int j=lay;j<nums.size();j++){// cout<<"   把这个数放在前面(lay号位)"<<nums[j]<<"->index="<<lay<<endl;vector<int> out_vec_copy = out_vec;int temp=out_vec_copy[j];out_vec_copy[j]=out_vec_copy[lay];out_vec_copy[lay]=temp;// cout<<"   操作后的新的数组为(并入队):";// for(int num:out_vec_copy) cout<<num<<" ";// cout<<endl;q_anss.push(out_vec_copy);lay2++;}}// cout<<"lay位置所有情况都已经固定(更新层)lay = "<<lay<<endl;// cout<<endl;//层更新if(lay1==0){lay1 = lay2;lay2 = 0;}}//将队列的内容放入向量中while(!q_anss.empty()){anss.push_back(q_anss.front());q_anss.pop();}return anss;}
};

全部子集【二进制法、增添法(类似回溯法)】

vector<vector<int>> subsets_1(vector<int>& nums){vector<vector<int>>anss;//构造vector<int>binary;for(int i=0;i<nums.size()+1;i++){binary.push_back(0);}//开始递增:所有情况while(!binary[0]){incrementBinary(binary);// printbinary(binary);vector<int> ans;for(int i=1;i<binary.size();i++){    if(binary[i]==1) ans.push_back(nums[i-1]);}anss.push_back(ans);}return anss;
}void incrementBinary(std::vector<int>& binary) {int n = binary.size();for (int i = n - 1; i >= 0; --i) {if (binary[i] == 0) {binary[i] = 1;return;} else {binary[i] = 0;}}
}void printbinary(std::vector<int>& binary) {for(int k=0;k<binary.size();k++) cout<<binary[k];cout<<endl;
}

 树的层序遍历:

class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>>anss_index;queue<vector<int>>q_IdxSet;vector<int>ans;ans.push_back(-1);q_IdxSet.push(ans);anss_index.push_back(ans);int lay1 = 1;int lay2 = 0;for(int lay=0;lay<nums.size();lay++){while(lay1){//本层还有的话就一直取//取vector<int>ans_out = q_IdxSet.front();q_IdxSet.pop();lay1--;//根据取的存:从最大的下标开始for(int k=1+ans_out.back();k<nums.size();k++){vector<int>ans_in = ans_out;//复制一份再添加ans_in.push_back(k);q_IdxSet.push(ans_in);anss_index.push_back(ans_in);lay2++;}}if(lay1==0){lay1 = lay2;lay2 = 0;}}vector<vector<int>>anss;for(int i=0;i<anss_index.size();i++){vector<int>ans;for(int j=0;j<anss_index[i].size();j++){if(anss_index[i][j]!=-1) ans.push_back(nums[anss_index[i][j]]);}anss.push_back(ans);}return anss;}
};

9键打字(还是和上面的解法一样)

class Solution {
public:vector<string> letterCombinations(string digits) {vector<string>ans;vector<vector<char>>keyboard;keyboard.push_back({});keyboard.push_back({});keyboard.push_back({'a','b','c'});keyboard.push_back({'d','e','f'});keyboard.push_back({'g','h','i'});keyboard.push_back({'j','k','l'});keyboard.push_back({'m','n','o'});keyboard.push_back({'p','q','r','s'});keyboard.push_back({'t','u','v'});keyboard.push_back({'w','x','y','z'});//开始层序遍历解空间queue<string> q;q.push("");int lay1 = 1;int lay2 = 0;for(int lay=0;lay<digits.size();lay++){while(lay1){//先取string out_string = q.front();q.pop();lay1--;//再存for(int j = 0;j<keyboard[int(digits[lay])-48].size();j++){string in_string = out_string;in_string+=keyboard[int(digits[lay])-48][j];q.push(in_string);lay2++;}}if(lay1==0){lay1 = lay2;lay2 = 0;}}//将q转为answhile(!q.empty()){if(q.front()!="")ans.push_back(q.front());q.pop();}return ans;}
};

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

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

相关文章

VMware Win10下载安装教程(超详细)

《网络安全自学教程》 从MSDN下载系统镜像&#xff0c;使用 VMware Workstation 17 Pro 安装 Windows 10 consumer家庭版 和 VMware Tools。 Win10下载安装 1、下载镜像2、创建虚拟机3、安装操作系统4、配置系统5、安装VMware Tools 1、下载镜像 到MSDN https://msdn.itellyou…

基础篇05-直方图操作

本节将简要介绍Halcon中有关图像直方图操作的算子&#xff0c;重点介绍直方图获取和显示两类算子&#xff0c;以及直方图均衡化处理算子。 目录 1. 引言 2. 获取并显示直方图 2.1 获取&#xff08;灰度&#xff09;直方图 (1) gray_histogram (2) gray_histo_abs (3) gr…

Oracle(windows安装遇到的ORA-12545、ORA-12154、ORA-12541、ORA-12514等问题)

其实出现该问题就是监听或者服务没有配好。 G:\xiaowangzhenshuai\software\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMINlistener.ora SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME CLRExtProc)(ORACLE_HOME G:\xiaowangzhenshuai\software\Oracle\product\11.2.0\d…

LabVIEW2025中文版软件安装包、工具包、安装教程下载

下载链接&#xff1a;LabVIEW及工具包大全-三易电子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2025安装图文教程》 1、解压后&#xff0c;双击install.exe安装 2、选中“我接受上述2条许可协议”&#xff0c;点击下一步 3、点击下一步&#xff0c;安装NI Packa…

在本地顺利的部署一个al模型从零开始 windows

引言 &#xff08;踩的坑&#xff0c;省流引言的内容没有有使模型跑起来&#xff09; 最近想在本地部署一个deepseek模型&#xff0c;就在网上搞了3 4天终于是能够部署下来了&#xff0c;在部署的时候也是成功的踩了无数的坑&#xff0c;比如我先问al如何在本地部署一个语言模…

基于ansible部署elk集群

ansible部署 ELK部署 ELK常见架构 &#xff08;1&#xff09;ElasticsearchLogstashKibana&#xff1a;这种架构是最常见的一种&#xff0c;也是最简单的一种架构&#xff0c;这种架构通过Logstash收集日志&#xff0c;运用Elasticsearch分析日志&#xff0c;最后通过Kibana中…

Linux学习笔记16---高精度延时实验

延时函数是很常用的 API 函数&#xff0c;在前面的实验中我们使用循环来实现延时函数&#xff0c;但是使用循环来实现的延时函数不准确&#xff0c;误差会很大。虽然使用到延时函数的地方精度要求都不会很严格( 要求严格的话就使用硬件定时器了 ) &#xff0c;但是延时函数肯定…

Linux系统 环境变量

环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量&#xff0c;本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”&#xff0c;我们会更详细讲解&#xff1b;理解环境变量的全局…

旋转变压器工作及解调原理

旋转变压器 旋转变压器是一种精密的位置、速度检测装置&#xff0c;广泛应用在伺服控制、机器人、机械工具、汽车、电力等领域。但是&#xff0c;旋转变压器在使用时并不能直接提供角度或位置信息&#xff0c;需要特殊的激励信号和解调、计算措施&#xff0c;才能将旋转变压器…

【漫话机器学习系列】076.合页损失函数(Hinge Loss)

Hinge Loss损失函数 Hinge Loss&#xff08;合页损失&#xff09;&#xff0c;也叫做合页损失函数&#xff0c;广泛用于支持向量机&#xff08;SVM&#xff09;等分类模型的训练过程中。它主要用于二分类问题&#xff0c;尤其是支持向量机中的优化目标函数。 定义与公式 对于…

基于docker搭建Kafka集群,使用KRaft方式搭建,摒弃Zookeeper

KAFKA基于docker使用KRaft进行集群搭建 环境&#xff1a;已成功搭建kafka服务 可点击链接跳转至安装kafka-3.8.0版本 并启用SASL认证 教程 使用基于Zookeeper方式搭建集群教程 kafka-3.8.0版本 并启用SASL认证 教程 搭建kafka-ui可视化工具 192.168.2.91 192.168.2.92 192…

Go 语言 | 入门 | 快速入门

快速入门 1.第一份代码 先检查自己是否有正确下载 Go&#xff0c;如果没有直接去 Go 安装 进行安装。 # 检查是否有 Go $ go version go version go1.23.4 linux/amd64然后根据 Go 的入门教程 开始进行学习。 # 初始化 Go 项目 $ mkdir example && cd example # Go…

凝思60重置密码

凝思系统重置密码 - 赛博狗尾草 - 博客园 问题描述 凝思系统进入单用户模式&#xff0c;在此模式下&#xff0c;用户可以访问修复错误配置的文件。也可以在此模式下安装显卡驱动&#xff0c;解决和已加载驱动的冲突问题。 适用范围 linx-6.0.60 linx-6.0.80 linx-6.0.100…

HTML 复习

文章目录 路径问题标题标签段落标签换行标签列表标签<ol> 有序列表<ul> 无序标签标签嵌套 超链接标签多媒体标签<img> 图片标签<audio> 音频标签<video> 视频标签 表格标签<colspan> 跨行<rowspan> 跨列组合使用 表单标签基本表单标…

hot100(8)

71.10. 正则表达式匹配 - 力扣&#xff08;LeetCode&#xff09; 动态规划 题解&#xff1a;10. 正则表达式匹配题解 - 力扣&#xff08;LeetCode&#xff09; 72.5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09; 动态规划 1.dp数组及下标含义 dp[i][j] : 下标i到…

114,【6】攻防世界 web wzsc_文件上传

进入靶场 传个桌面有的 直接空白了 我们 访问一下上传的东西 /index 没显示用于解析的.htaccess和.user.ini 文件&#xff0c;还两个都不显示 但上传的时候bp查看状态码是200&#xff0c;意味着上传成功了 别的博主说这是服务器在短时间内就立刻将其删掉了&#xff0c;需…

禅道社区版项目管理软件部署(记录篇)

系统要求&#xff08;这里推荐使用docker容器化方式&#xff09;安装前的准备Docker快速安装最后通过查看地址验证是否部署成功开始界面化安装配置 禅道&#xff08;ZenTao&#xff09;是一款国产开源的项目管理软件&#xff0c;专注于敏捷开发流程&#xff0c;支持 Scrum 和 K…

B站自研的第二代视频连麦系统(上)

导读 本系列文章将从客户端、服务器以及音视频编码优化三个层面&#xff0c;介绍如何基于WebRTC构建视频连麦系统。希望通过这一系列的讲解&#xff0c;帮助开发者更全面地了解 WebRTC 的核心技术与实践应用。 背景 在文章《B站在实时音视频技术领域的探索与实践》中&#xff…

Selenium记录RPA初阶 - 基本输入元件

防止自己遗忘&#xff0c;故作此为记录。 爬取网页基本元件并修改后爬取。 包含元件&#xff1a; elements: dict[str, str] {"username": None,"password": None,"email": None,"website": None,"date": None,"ti…

Ubutun本地部署DeepSeek R1

目录 一、本地部署&终端命令行交互 二、网页端交互 三、参考链接 一、本地部署&终端命令行交互 Ollama 是一个轻量级的大语言模型管理工具&#xff0c;支持 Windows / Mac / Linux。 Ollama官网&#xff1a;Ollama # 下载安装ollama curl -fsSL https://ollama.co…