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;}
};
单词搜索【递归、空间超过】
class Solution {
private:bool ans;
public:bool exist(vector<vector<char>>& board, string word) {ans = false;for(int i=0;i<board.size();i++){for(int j=0;j<board[0].size();j++){if(board[i][j]==word[0]) {map<string,bool>trace_m;dfs(board,word,i,j,0,trace_m);}}}return ans;}void dfs(vector<vector<char>>& board, string word, int i, int j, int idx , map<string,bool> trace_m){//越界if(i<0 || j<0 || i>=board.size() || j>=board[0].size()) return;if(idx==word.size())return;//字母不符合if(board[i][j]!=word[idx]) return;//解决回头文string add = to_string(i) + to_string(j);if(trace_m.count(add) && trace_m[add])return;trace_m[add] = true;if(idx==word.size()-1){ans = true; return;}dfs(board,word,i-1,j,idx+1,trace_m);dfs(board,word,i+1,j,idx+1,trace_m);dfs(board,word,i,j+1,idx+1,trace_m);dfs(board,word,i,j-1,idx+1,trace_m);}
};//题解给的
class Solution {
public://visited是原件传入,k为下标//check(board, visited, i, j, word, 0);bool check(vector<vector<char>>& board, vector<vector<int>>& visited, int i, int j, string& s, int k) {if (board[i][j] != s[k]) { //模式匹配失败return false;} else if (k == s.length() - 1) { //越界return true;}//模式匹配成功+不越界visited[i][j] = true;//标记vector<pair<int, int>> directions{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};bool result = false;for (const auto& dir: directions) {//dir表示四个方向int newi = i + dir.first, newj = j + dir.second;//新坐标if (newi >= 0 && newi < board.size() && newj >= 0 && newj < board[0].size()) {//没有越界if (!visited[newi][newj]) {//没被访问过//bool flag = check(board, visited, newi, newj, s, k + 1);if (flag) {result = true;break;}//}}}visited[i][j] = false;return result;}bool exist(vector<vector<char>>& board, string word) {int h = board.size(), w = board[0].size();vector<vector<int>> visited(h, vector<int>(w)); //初始化二维数组for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) { //每个地方都调用checkbool flag = check(board, visited, i, j, word, 0);//每次从头遍历都用一个新的visitif (flag) {return true;}}}return false;}
};
N皇后(广度优先)
class Solution {vector<vector<string>> ans;
public:vector<vector<string>> solveNQueens(int n) {vector<string> CB = initChess(n);//广度优先算法queue<vector<string>> q_CB;q_CB.push(CB);int lay1 = 1;int lay2 = 0;for(int lay = 0; lay<n; lay++){while(lay1){//取棋盘vector<string> CB_out = q_CB.front();q_CB.pop();lay1--;//生成新棋盘(条件:CB_out是活棋)if(!isDied(CB_out,lay)){//遍历这一行,只要是0就可以下Qfor(int j = 0; j < n; j++){if(CB_out[lay][j] == '0'){vector<string> CB_in = writeQ(CB_out,lay,j);q_CB.push(CB_in);lay2++;//判断是否是最终结果if(lay==n-1 && isSuccess(CB_in)){ans.push_back(CB_in);}}}//只要是0就可以下Q}}//while(lay1){if(lay1==0){lay1 = lay2;lay2 = 0;}}return ans;}vector<string> initChess(int n){string row = "";for(int i=0;i<n;i++){row+="0";}// cout<<row;vector<string> chessB;for(int i=0;i<n;i++){chessB.push_back(row);}return chessB;}void printChess(vector<string>cB){cout<<"打印棋盘"<<endl;for(int i=0;i<cB.size();i++){cout<<cB[i]<<endl;}cout<<endl;}bool isDied(vector<string>& CB,int row){//看看第row行是否都是“.”int pointnum = 0;for(int i=0;i<CB.size(); i++){if(CB[row][i] == '.') pointnum++;}if(pointnum == CB.size()) return true;else return false;}bool isSuccess(vector<string>& CB){//看看第-1行是否有n-1个“.”int pointnum = 0;for(int i=0;i<CB.size(); i++){if(CB[CB.size()-1][i] == '.') pointnum++;}if(pointnum == CB.size()-1) return true;else return false;}//下棋//vector<string> CB_in = writeQ(CB_out,lay,j);vector<string> writeQ(vector<string>CB, int row, int j){//横向for(int i=0;i<CB.size();i++){CB[row][i] = '.';}for(int i=0;i<CB.size();i++){CB[i][j] = '.';}CB[row][j] = 'Q';//斜向for(int i = row+1;i<CB.size();i++){if(j-i+row >=0 && j-i+row<=CB.size()-1) CB[i][j-i+row] = '.';if(j+i-row >=0 && j+i-row<=CB.size()-1) CB[i][j+i-row] = '.';}return CB;}
};
相关文章:
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 …...
Windows编程:下载与安装 Visual Studio 2010
本节前言 在写作本节的时候,本来呢,我正在写的专栏,是 MFC 专栏。而 VS2010 和 VS2019,正是 MFC 学习与开发中,可以使用的两款软件。然而呢,如果你去学习 Windows API 知识的话,那么࿰…...
OpenEuler学习笔记(十八):搭建企业云盘服务
要在 OpenEuler 上搭建企业云盘,可借助一些开源软件来实现,以下以 Nextcloud 为例详细介绍搭建步骤。Nextcloud 是一款功能丰富的开源云存储解决方案,支持文件共享、同步、协作等多种功能。 1. 系统环境准备 确保 OpenEuler 系统已更新到最…...
什么是三层交换技术?与二层有什么区别?
什么是三层交换技术?让你的网络飞起来! 一. 什么是三层交换技术?二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注,有错误的地方请指出,看个人主页有惊喜。 作者:神的孩子都在歌唱 大家好…...
Ollama+deepseek+Docker+Open WebUI实现与AI聊天
1、下载并安装Ollama 官方网址:Ollama 安装好后,在命令行输入, ollama --version 返回以下信息,则表明安装成功, 2、 下载AI大模型 这里以deepseek-r1:1.5b模型为例, 在命令行中,执行&…...
数字滤波器的分类
数字滤波器可以根据不同的标准进行分类,以下是几种常见的分类方式: 1. 按实现结构分类 FIR滤波器(有限脉冲响应滤波器) - 特点:系统的脉冲响应在有限时间内衰减到零。 - 优点:线性相位特性(保…...
MySQL主要使用的几种索引算法
MySQL 索引算法详解 在 MySQL 中,索引是一种提高查询速度的数据结构。不同的索引算法适用于不同的查询场景,本文将详细介绍 MySQL 的几种主要索引算法。 1. BTree 索引(默认索引) 1.1 存储结构 BTree(B 树ÿ…...
Linux生成自签证书【Nginx】
👨🎓博主简介 🏅CSDN博客专家 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入!…...
网络安全 | 加密技术揭秘:保护数据隐私的核心
网络安全 | 加密技术揭秘:保护数据隐私的核心 一、前言二、对称加密技术2.1 原理2.2 优点2.3 缺点2.4 应用场景 三、非对称加密技术3.1 原理3.2 优点3.3 缺点3.4 应用场景 四、哈希函数4.1 原理4.2 优点4.3 缺点4.4 应用场景 五、数字签名5.1 原理5.2 优点5.3 缺点5…...
使用服务器部署DeepSeek-R1模型【详细版】
文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中,模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别,如何高效、稳定地将深度学习模型部署到…...
DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区
Direct3D 11 总结 —— 4 绘制三角形_direct绘制三角形-CSDN博客 DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区 - X_Jun - 博客园 练习题 粗体字为自定义题目 尝试交换三角形第一个和第三个顶点的数据,屏幕将显示什么?为什么&…...
Continue 与 CodeGPT 插件 的对比分析
以下是 Continue 与 CodeGPT 插件 的对比分析,涵盖功能定位、适用场景和核心差异: 1. 功能定位 工具核心功能技术基础Continue专注于代码自动补全和上下文感知建议,支持多语言,强调低延迟和轻量级集成。基于本地模型或轻量级AI&a…...
第二次连接k8s平台注意事项
第二次重新打开集群平台 1.三台机子要在VMware打开 2.MobaBXterm连接Session 3.三个机子docker重启 systemctl restart docker4.主节点进行平台链接 docker pull kubeoperator/kubepi-server[rootnode1 home]# docker pull kubeoperator/kubepi-server [rootnode1 home]# # 运…...
Ruby Dir 类和方法详解
Ruby Dir 类和方法详解 引言 在Ruby编程语言中,Dir类是一个非常有用的工具,它允许我们与文件系统进行交互,如列出目录内容、检查文件是否存在等。Dir类提供了多种方法,使得文件系统的操作变得简单且高效。本文将详细介绍Ruby中的…...
Mybatis篇
1,什么是Mybatis ( 1 )Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁…...
三维粒子滤波(Particle Filter)MATLAB例程,估计三维空间中匀速运动目标的位置(x, y, z),提供下载链接
三维粒子滤波(Particle Filter)MATLAB例程,估计三维空间中匀速运动目标的位置(x, y, z) 文章目录 介绍功能运行结果代码介绍 本 MATLAB 代码实现了三维粒子滤波( P a r t i c l e F i l t e...
WebAssembly:前后端开发的未来利器
引言 在互联网的世界里,前端和后端开发一直是两块重要的领域。而 JavaScript 长期以来是前端的霸主,后端则有各种语言诸如 Java、Python、Node.js、Go 等等。然而,近年来一个名为 WebAssembly (Wasm) 的技术正在逐渐改变这一格局。它的高性能…...
设计模式Python版 享元模式
文章目录 前言一、享元模式二、享元模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间的组合&…...
深入理解 YUV Planar 和色度二次采样 —— 视频处理的核心技术
深入理解 YUV Planar 和色度二次采样 —— 视频处理的核心技术 在现代视频处理和编码中,YUV 颜色空间和**色度二次采样(Chroma Subsampling)**是两个非常重要的概念。它们的结合不仅能够显著减少视频数据量,还能在保持较高视觉质量的同时优化存储和传输效率。而 YUV Plana…...
从0开始,来看看怎么去linux排查Java程序故障
一,前提准备 最基本前提:你需要有liunx环境,如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后,你还需要安装jdk和配置环境变量 1. 安装JDK(以OpenJDK 17为例) 下载JDK…...
【MySQL】centos 7 忘记数据库密码
vim /etc/my.cnf文件; 在[mysqld]后添加skip-grant-tables(登录时跳过权限检查) 重启MySQL服务:sudo systemctl restart mysqld 登录mysql,输入mysql –uroot –p;直接回车(Enter) 输…...
区块链项目孵化与包装设计:从概念到市场的全流程指南
区块链技术的快速发展催生了大量创新项目,但如何将一个区块链项目从概念孵化成市场认可的产品,是许多团队面临的挑战。本文将从孵化策略、包装设计和市场落地三个维度,为你解析区块链项目成功的关键步骤。 一、区块链项目孵化的核心要素 明确…...
JavaScript基础入门(一):从零开始掌握网页互动与动态效果
JS基础(一) 目的:html是骨架,css是血和肉,js 就是灵魂 知识点一:JavaScript基本使用 网页的三剑客分别是:HTML、CSS、JS,我们把HTML当做毛坯房,CSS是房子的装修&#…...
20240824 美团 笔试
文章目录 1、单选题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、编程题2.12.2岗位:硬件开发工程师(嵌入式系统软件开发方向) 题型:20 道单选题,2 道编程题题 1、单选题 1.1 C 语言中,如果输入整数 v 是 2 的幂,下面表达式中哪个会返…...
css-根据不同后端返回值返回渲染不同的div样式以及公共组件设定
1.动态绑定 Vue: 使用计算属性 getClassName 来动态计算样式类名,并通过 :class 绑定到 div 元素上。 <template><div :class"getClassName">这是一个根据后端值动态设置样式的 div 元素。</div> </template><script> exp…...
【数据科学】一个强大的金融数据接口库:AKShare
文章目录 1. AKShare 简介2. 安装 AKShare3. AKShare 核心功能3.1 获取股票数据3.2 获取股票实时数据3.3 获取基金数据3.4 获取期货数据3.5 获取外汇数据3.6 获取数字货币数据 4. 数据处理与存储5. 实战案例6. 总结 AKShare 是一个开源的金融数据接口库,它提供了简单…...
Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群
Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群 简介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系统安装部署 Kubernetes v1.29.13 集群 1 环境准备1.1 集群IP规划1.2 初始化步骤(各个节点都需执行)1.2.1 主机名与IP地址解析1.…...
如何开发一个大语言模型,开发流程及需要的专业知识
开发大型语言模型(LLM)是一个复杂且资源密集的过程,涉及多个阶段和跨学科知识。以下是详细的开发流程和所需专业知识指南: 一、开发流程 1. 需求分析与规划 目标定义:明确模型用途(如对话、翻译、代码生成…...
10. 神经网络(二.多层神经网络模型)
多层神经网络(Multi-Layer Neural Network),也称为深度神经网络(Deep Neural Network, DNN),是机器学习中一种重要的模型,能够通过多层次的非线性变换解决复杂的分类、回归和模式识别问题。以下…...
Windows 中学习Docker环境准备3、在Ubuntu中安装Docker
Windows 中学习Docker环境准备1、Win11安装Docker Desktop Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu Windows 中学习Docker环境准备3、在Ubuntu中安装Docker 需要更多Docker学习视频和资料,请文末联系 步骤 1:更新系统并安装依赖…...
