数据结构与算法——搜索

文章目录

    • 1.内容概述
    • 2.岛屿数量
      • 2.1 题目描述
      • 2.2 DFS深度搜索算法思路
      • 2.3 BFS宽度搜索算法思路
      • 2.4 C++代码实现
    • 3.单词接龙
      • 3.1 题目描述
      • 3.2 算法思路
      • 3.3 C++代码实现
    • 4.单词接龙 II
      • 4.1 题目描述
      • 4.2 算法思路
    • 5.火柴拼正方形
      • 5.1 题目描述
      • 5.2 算法思路
      • 5.3 代码实现
      • 5.4 算法思路2
      • 5.5 代码实现

1.内容概述

在这里插入图片描述

2.岛屿数量

2.1 题目描述

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:输入:grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]
]
输出:1示例 2:输入:grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]
]
输出:3

2.2 DFS深度搜索算法思路

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<vector>
using namespace std;void DFS(vector<vector<int>>& mark, vector<vector<char>>& grid, int x, int y) {mark[x][y] = 1;int dx[] = { -1,1,0,0 };int dy[] = { 0,0,-1,1 };for (int i = 0; i < 4; i++) {int new_x = x + dx[i];int new_y = y + dy[i];if (new_x < 0 || new_y < 0 || new_x >= mark.size() || new_y >= mark[new_x].size()) {continue;}if (mark[new_x][new_y] == 0 && grid[new_x][new_y] == '1') {DFS(mark, grid, new_x, new_y);}}
}int main()
{vector<vector<char>> grid = { {'1','1','1','0','0'},{'1','1','0','0','0'},{'0','0','1','0','0'},{'0','0','0','1','1'} };vector<vector<int>> mark = { {0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},};DFS(mark, grid, 1, 1);for (int i = 0 ; i<mark.size(); i++) {for (int j = 0; j < mark[i].size(); j++) {cout << mark[i][j] << " ";}cout << endl;}return 0;
}
1 1 1 0 0
1 1 0 0 0
0 0 0 0 0
0 0 0 0 0

2.3 BFS宽度搜索算法思路

在这里插入图片描述在这里插入图片描述

2.4 C++代码实现

在这里插入图片描述

class Solution {
public:void DFS(vector<vector<int>>& mark,vector<vector<char>>& grid,int x,int y){mark[x][y]=1;int dx[]={-1,1,0,0};int dy[]={0,0,-1,1};for(int i=0;i<4;i++){int new_x=x+dx[i];int new_y=y+dy[i];if(new_x<0||new_y<0||new_x>=mark.size()||new_y>=mark[new_x].size()){continue;}if(mark[new_x][new_y]==0&&grid[new_x][new_y]=='1'){DFS(mark,grid,new_x,new_y);}}}void BFS(vector<vector<int>>& mark, vector<vector<char>>& grid, int x, int y) {queue<pair<int, int>> Q;int dx[] = { -1,1,0,0 };int dy[] = { 0,0,-1,1 };Q.push(make_pair(x, y));mark[x][y] = 1;while (!Q.empty()) {x = Q.front().first;y = Q.front().second;Q.pop();for (int i = 0; i < 4; i++) {int new_x = x + dx[i];int new_y = y + dy[i];if (new_x < 0 || new_y < 0 || new_x >= mark.size() || new_y >= mark[new_x].size()) {continue;}if (mark[new_x][new_y] == 0 && grid[new_x][new_y] == '1') {mark[new_x][new_y] = 1;Q.push(make_pair(new_x, new_y));}}}}int numIslands(vector<vector<char>>& grid) {int island=0;vector<vector<int>> mark;for(int i=0;i<grid.size();i++){mark.push_back(vector<int>());for(int j=0;j<grid[i].size();j++){mark[i].push_back(0);}} for(int x=0;x<grid.size();x++){for(int y=0;y<grid[x].size();y++){if(mark[x][y]==0&&grid[x][y]=='1'){DFS(mark,grid,x,y);//或者BFS(mark,grid,x,y);island++;}}} return island;}
};

3.单词接龙

3.1 题目描述

字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:

序列中第一个单词是 beginWord 。
序列中最后一个单词是 endWord 。
每次转换只能改变一个字母。
转换过程中的中间单词必须是字典 wordList 中的单词。

给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。

示例 1:输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:5
解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。示例 2:输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:0
解释:endWord "cog" 不在字典中,所以无法进行转换。

3.2 算法思路

在这里插入图片描述
在这里插入图片描述

	bool connect(const string& word1,const string& word2){int cnt=0;for(int i=0;i<word1.length();i++){if(word1[i]!=word2[i]){cnt++;}}return cnt==1;}void construct_graph(string& beginWord,vector<string>& wordList,map<string,vector<string>>& graph){wordList.push_back(beginWord);for(int i=0;i<wordList.size();i++){graph[wordList[i]]=vector<strng>();}for(int i=0;i<wordList.size();i++){for(int j=i+1;j<wordList.size();j++){if(connect(wordList[i]),wordList[j]){graph[wordList[i]].push_back(wordList[j]);graph[wordList[j]].push_back(wordList[i]);}}}}

3.3 C++代码实现

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

class Solution {
public:bool connect(const string& word1,const string& word2){int cnt=0;for(int i=0;i<word1.length();i++){if(word1[i]!=word2[i]){cnt++;}}return cnt==1;}void construct_graph(string& beginWord,vector<string>& wordList,map<string,vector<string>>& graph){wordList.push_back(beginWord);for(int i=0;i<wordList.size();i++){graph[wordList[i]]=vector<string>();}for(int i=0;i<wordList.size();i++){for(int j=i+1;j<wordList.size();j++){if(connect(wordList[i],wordList[j])){graph[wordList[i]].push_back(wordList[j]);graph[wordList[j]].push_back(wordList[i]);}}}}int BFS_graph(string& beginWord,string& endWord,map<string,vector<string>>& graph){queue<pair<string,int>> Q;set<string> visit;Q.push(make_pair(beginWord,1));visit.insert(beginWord);while(!Q.empty()){string node=Q.front().first;int step=Q.front().second;Q.pop();if(node==endWord){return step;}vector<string> neighbor=graph[node];for(int i=0;i<neighbor.size();i++){if(visit.find(neighbor[i])==visit.end()){Q.push(make_pair(neighbor[i],step+1));visit.insert(neighbor[i]);}}}return 0;}int ladderLength(string beginWord, string endWord, vector<string>& wordList) {map<string,vector<string>> graph;construct_graph(beginWord,wordList,graph);int result=BFS_graph(beginWord,endWord,graph);return result;}
};

4.单词接龙 II

4.1 题目描述

按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> … -> sk 这样的单词序列,并满足:

每对相邻的单词之间仅有单个字母不同。
转换过程中的每个单词 si(1 <= i <= k)必须是字典 wordList 中的单词。
注意,beginWord 不必是字典 wordList 中的单词。
sk == endWord

给你两个单词 beginWord 和 endWord ,以及一个字典 wordList 。请你找出并返回所有从 beginWord 到 endWord 的 最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 [beginWord, s1, s2, …, sk] 的形式返回。

示例 1:输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]
解释:存在 2 种最短的转换序列:
"hit" -> "hot" -> "dot" -> "dog" -> "cog"
"hit" -> "hot" -> "lot" -> "log" -> "cog"示例 2:输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:[]
解释:endWord "cog" 不在字典 wordList 中,所以不存在符合要求的转换序列。

4.2 算法思路

在这里插入图片描述
在这里插入图片描述

5.火柴拼正方形

5.1 题目描述

还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。

输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。

示例 1:输入: [1,1,2,2,2]
输出: true解释: 能拼成一个边长为2的正方形,每边两根火柴。示例 2:输入: [3,3,3,3,4]
输出: false解释: 不能用所有火柴拼成一个正方形。

5.2 算法思路

在这里插入图片描述

5.3 代码实现

class Solution {
public:bool makesquare(vector<int>& matchsticks) {if(matchsticks.size()<4){return false;}int sum=0;for(int i=0;i<matchsticks.size();i++){sum+=matchsticks[i];}if(sum%4){return false;}sort(matchsticks.rbegin(),matchsticks.rend());int bucket[4]={0};return generate(0,matchsticks,sum/4,bucket);}
private:bool generate(int i,vector<int>& matchsticks,int target,int bucket[]){if(i>=matchsticks.size()){return bucket[0]==target&&bucket[1]==target&&bucket[2]==target&&bucket[3]==target;}for(int j=0;j<4;j++){if(bucket[j]+matchsticks[i]>target){continue;}bucket[j]+=matchsticks[i];if(generate(i+1,matchsticks,target,bucket)){return true;}bucket[j]-=matchsticks[i];}return false;}
};

5.4 算法思路2

在这里插入图片描述

5.5 代码实现

class Solution {
public:bool makesquare(vector<int>& matchsticks){if(matchsticks.size()<4){return false;}int sum=0;for(int i=0;i<matchsticks.size();i++){sum+=matchsticks[i];}if(sum%4){return false;}int target=sum/4;vector<int> ok_subset;vector<int> ok_half;int all=1<<matchsticks.size();for(int i=0;i<all;i++){int sum=0;for(int j=0;j<matchsticks.size();j++){if(i&(1<<j)){sum+=matchsticks[j];}}if(sum==target){ok_subset.push_back(i);}}for(int i=0;i<ok_subset.size();i++){for(int j=i+1;j<ok_subset.size();j++){if((ok_subset[i]&ok_subset[j])==0){ok_half.push_back(ok_subset[i]|ok_subset[j]);}}}for(int i=0;i<ok_half.size();i++){for(int j=i+1;j<ok_half.size();j++){if((ok_half[i]&ok_half[j])==0){return true;}}}return false;}
}

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

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

相关文章

小程序基础能力~网络

&#xff08;1&#xff09;网络-使用说明 网络 在小程序/小游戏中使用网络相关的 API 时&#xff0c;需要注意下列问题&#xff0c;请开发者提前了解。 1. 服务器域名配置 每个微信小程序需要事先设置通讯域名&#xff0c;小程序只可以跟指定的域名与进行网络通信。包括普通 HT…

mybatis学习笔记-02-第一个mybatis程序

该视频为狂神说java视频配套笔记&#xff08;博主自己手打223&#xff0c;日后做个参考223&#xff09;&#xff0c;b站连接&#xff1a;Mybatis最新完整教程IDEA版【通俗易懂】-02-第一个mybatis程序) 文章目录2.第一个mybatis程序2.1搭建环境2.2 创建一个模块2.3编写代码2.4测…

徐波所长专访 | 人工智能:从“作坊式”走向“工业化”新时代

来源&#xff1a;人民网人工智能创新不断 “一体两翼”快速发展人民网&#xff1a;当前&#xff0c;人工智能技术创新不断&#xff0c;应用层出不穷。它究竟走到了哪一步&#xff1f;能否谈谈您是如何看待我国人工智能技术发展现状的&#xff1f;徐波&#xff1a;人工智能是一个…

linux——线程(1)

文章目录1.线程概念1.1 什么是线程1.2 线程和进程区别1.3 线程实现原理1.4 三级映射1.5 线程共享资源1.6 线程非共享资源1.7 线程优、缺点2.线程控制原语2.1 pthread_self 函数2.2 pthread_create 函数3.线程与共享3.1 线程共享全局变量4.线程退出4.1 pthread_exit 函数1.线程概…

Redis压缩列表原理与应用分析

摘要 Redis是一款著名的key-value内存数据库软件&#xff0c;同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型&#xff0c;同时每种数据结构类型针对不同的应用场景又支持不同的编码方式。这篇文章主要介绍压缩列表编码&…

Science公布2021年度十大科学突破,AI这项前所未有的突破上榜

来源&#xff1a; 学术头条撰文&#xff1a;朱哼哼编审&#xff1a;王哈哈排版&#xff1a;李雪薇2021 年 11 月 17 日&#xff0c;Science 杂志公布了 2021 年的年度科学突破榜单&#xff0c;AlphaFold 和 RoseTTA-fold 两种基于人工智能预测蛋白质结构的技术位列榜首。除此之…

OpenAI教GPT-3学会上网,「全知全能」的AI模型上线了

来源&#xff1a;机器学习研究组订阅它被命名为 WebGPT&#xff0c;OpenAI 认为浏览网页的方式提高了 AI 解答问题的准确性。如果 AI 学会上网&#xff0c;那么它就拥有了无限获取知识的方式&#xff0c;之后会发生什么就不太好预测了。于是著名 AI 研究机构 OpenAI 教那个开启…

Hadoop(2):常见的MapReduce[在Ubuntu中运行!]

1 以词频统计为例子介绍 mapreduce怎么写出来的 弄清楚MapReduce的各个过程&#xff1a; 将文件输入后&#xff0c;返回的<k1,v1>代表的含义是&#xff1a;k1表示偏移量&#xff0c;即v1的第一个字母在文件中的索引&#xff08;从0开始数的&#xff09;&#xff1b;v1表…

springboot学习笔记-01-springboot-helloworld的编写以及原理初步了解(自动装配)

文章目录原理初探主程序关于spring boot&#xff0c;谈谈你的理解&#xff1a;微服务阶段原理初探 pom.xml spring-boot-dependencies&#xff1a;核心依赖在父工程中&#xff01;我们在写或者引入一些springboot依赖的时候&#xff0c;不需要指定版本&#xff0c;就因为有这…

2022年:机器人技术的重大革命

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮一段时间以来&#xff0c;跟踪机器人技术发展的人已经注意到该领域的一场无声革命。虽然自动驾驶汽车占据了所有的头条新闻&#xff0c;但人工智能、机器视觉和机器学习的交叉领域正在迅速成为下一阶段机器人技术的基础。通过将…

陈天奇高赞文章:新一代深度学习编译技术变革和展望

来源&#xff1a;机器之心作者&#xff1a;陈天奇陈天奇是机器学习领域著名的青年华人学者之一&#xff0c;本科毕业于上海交通大学ACM班&#xff0c;博士毕业于华盛顿大学计算机系&#xff0c;研究方向为大规模机器学习。在本文中&#xff0c;陈天奇回答了目前深度学习编译技术…

操作系统欢乐笔记-01-带你推开操作系统的大门(雾)

B站-操作系统-哈尔并工业大学-劝退警告223 文章目录1.什么是操作系统&#xff1f;什么是操作系统&#xff1f;小目标&#xff1f;2.揭开钢琴的盖子熟悉的win开机画面从白纸到图灵机冯-诺依曼一拍脑袋瓜&#xff0c;他说摁下开机键这段不是rap 223 劝退警告emmmmm1.什么是操作系…

2022年值得关注的22项新兴技术

来源&#xff1a;参考消息网英国《经济学人》网站11月8日发表题为《下一个是什么&#xff1f;2022年值得关注的22项新兴技术》的文章。在文章列举的22项新技术中&#xff0c;既有今年大热的“元宇宙”、太空旅游、脑机接口&#xff0c;也有备受期待的量子计算、艾滋病病毒疫苗……

分别安装搭建lamp服务环境

一、 分别安装搭建lamp服务环境 准备工作&#xff1a; 1、配置防火墙&#xff0c;开启80端口、3306端口vi /etc/sysconfig/iptables-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT #允许80端口通过防火墙-A INPUT -m state –state NEW -m tcp -p tcp –dp…

springdata学习笔记-01-helloworld-(暂时不全223)

第一天 orm思想和hibernate以及jpa的概述和jpd的基本操作 传统jdbc操作 获取链接创建statement对象可以对占位符赋值发送查询 操作繁琐占位符赋值麻烦 orm思想 主要目的&#xff1a;操作实体类就相当于操作数据库表建立两个映射关系 实体类和表的映射关系实体类中属性和表中…

nginx学习笔记-01nginx入门,环境搭建,常见命令

nginx学习笔记-01nginx入门&#xff0c;环境搭建&#xff0c;常见命令 文章目录nginx学习笔记-01nginx入门&#xff0c;环境搭建&#xff0c;常见命令1.nginx的基本概念2.nginx的安装&#xff0c;常用命令和配置文件3.nginx配置实例1.nginx的基本概念 nginx是什么&#xff0c;做…

MIT博士用概率编程让AI和人类一样看三维|NeurIPS 2021

来源&#xff1a;机器学习研究组订阅人与AI之间最大的区别就是对常识的利用&#xff01;无论各种AI模型在各大排行榜以何种性能超越了人类&#xff0c;它们在常识的利用上仍然远远不及人类&#xff0c;而这也正是目前AI研究中需要面临的一个巨大的挑战。对于自然语言处理的研究…

Unity Shader 2D水流效果

水流的模拟主要运用了顶点变换和纹理动画的结合&#xff1b; 顶点变换中&#xff0c;利用正弦函数模拟河流的大致形态&#xff0c;例如波长&#xff0c;振幅等。 纹理动画中&#xff0c;将纹理坐标朝某一方向持续滚动以形成流动的效果。 脚本如下&#xff1a; 1 Shader "M…

2022年智能家居十大预测新鲜出炉:全屋智能驶入快车道?健身镜成新宠……

来源&#xff1a;物联网智库 2021年接近尾声&#xff0c;这一年&#xff0c;新冠病毒仍旧没有离开地球&#xff0c;而在疫情常态化、工作与生活回归正轨之余&#xff0c;人们对于网络与虚拟世界的依赖度也陡然骤增。这一转变无疑将极大拉动消费端的数字化产业发展&#xff0c;除…

数据结构与算法——动态规划

文章目录1.内容概述2.爬楼梯2.1 题目描述2.算法思想2.3 代码实现3.打家劫舍3.1 题目描述3.2 算法思路3.3 代码实现4.最大子序和4.1 题目描述4.2 算法思路4.3 代码思路5. 零钱兑换5.1 题目描述5.2 算法思路5.3 代码实现6.三角形最小路径和6.1 题目描述6.2 算法思路6.3 代码实现7…