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

如何根据仿站做网站网站统计哪个好用

如何根据仿站做网站,网站统计哪个好用,室内设计效果图马克笔,互联网兼职做网站维护文章目录 一、200、岛屿数量1.1 深度优先搜索DFS1.2 广度优先搜索BFS 二、695、岛屿的最大面积2.1 深度优先搜索DFS2.2 广度优先搜索BFS 三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、200、岛屿数量 1.1 深度优先搜…

文章目录

  • 一、200、岛屿数量
    • 1.1 深度优先搜索DFS
    • 1.2 广度优先搜索BFS
  • 二、695、岛屿的最大面积
    • 2.1 深度优先搜索DFS
    • 2.2 广度优先搜索BFS
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、200、岛屿数量

在这里插入图片描述

1.1 深度优先搜索DFS

  思路分析:本题当中1代表的是陆地,0代表海洋,我们需要计算连接在一起的陆地(岛屿)数量,而上下左右这种才算连接在一起,对角线和反对角线上的元素不算。例如下图算三个岛屿:
在这里插入图片描述

  基本思路是遇到一个没有遍历过的陆地,计数器++,然后把该节点陆地连接的陆地全部标记上。遇到标记过的陆地节点和海洋节点全部跳过,最终计数器就是岛屿的数量。因为要标价节点是否遍历过,所以我们创建一个visited布尔数组,false代表未遍历过,true代表遍历过。遍历二维数组采用两个for循环。节点的连接节点遍历通过偏移量数组delta_x_y。终止条件和越界参数处理的if语句相同。

  程序如下

// 200、岛屿数量-深度优先搜索
class Solution {
private:int result = 0;vector<vector<int>> delta_x_y = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };	// 上下左右四个方向的偏移量void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {	// 1、递归输入参数// 3、单层递归逻辑for (int i = 0; i < 4; i++) {int nextx = x + delta_x_y[i][0];int nexty = y + delta_x_y[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过 2、终止条件if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 没有访问过的,同时是陆地的visited[nextx][nexty] = true;dfs(grid, visited, nextx, nexty);}}		}
public:int numIslands(vector<vector<char>>& grid) {vector<vector<bool>> visited = vector<vector<bool>>(grid.size(), vector<bool>(grid[0].size(), false));	// 遍历过的坐标for (int i = 0; i < grid.size(); i++) {	// 遍历行for (int j = 0; j < grid[0].size(); j++) {	// 遍历列if (!visited[i][j] && grid[i][j] == '1') {visited[i][j] = true;	// 遍历的陆地标记改为trueresult++;		// 遇到没访问过的陆地,岛屿数量++dfs(grid, visited, i, j);	// 深度优先搜索,将连接的陆地都标记上true}}}return result;}
};

复杂度分析:

  • 时间复杂度: O ( m × n ) O(m \times n) O(m×n),其中 m m m n n n分别是岛屿数组的行数和列数。
  • 空间复杂度: O ( m × n ) O(m \times n) O(m×n),主要是栈的调用,最坏情况下,网格全是陆地,深度优先搜索的深度达到 m × n m \times n m×n

1.2 广度优先搜索BFS

  思路分析:广度优先搜索是一圈一圈的搜索过程,而模拟这样的搜索过程可以用队列来实现。每当我们将坐标加入队列时,就代表该左边已经遍历过了,将visited数组标记为true。
  程序如下

// 200、岛屿数量-广度优先搜索
class Solution2 {
private:int result = 0;vector<vector<int>> delta_x_y = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };	// 上下左右四个方向的偏移量void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que; // 定义队列,队列中的元素是对组 pair<int, int>que.push({ x, y }); // 起始节点加入队列visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点while (!que.empty()) { // 开始遍历队列里的元素pair<int, int> cur = que.front(); que.pop(); // 从队列取元素int curx = cur.first;int cury = cur.second; // 当前节点坐标for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历int nextx = curx + delta_x_y[i][0]; int nexty = cury + delta_x_y[i][1]; // 获取周边四个方向的坐标if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 如果节点没被访问过que.push({ nextx, nexty });  // 队列添加该节点为下一轮要遍历的节点visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问}}}}
public:int numIslands(vector<vector<char>>& grid) {vector<vector<bool>> visited = vector<vector<bool>>(grid.size(), vector<bool>(grid[0].size(), false));	// 遍历过的坐标for (int i = 0; i < grid.size(); i++) {	// 遍历行for (int j = 0; j < grid[0].size(); j++) {	// 遍历列if (!visited[i][j] && grid[i][j] == '1') {visited[i][j] = true;	// 遍历的陆地标记改为trueresult++;		// 遇到没访问过的陆地,岛屿数量++bfs(grid, visited, i, j);	// 深度优先搜索,将连接的陆地都标记上true}}}return result;}
};

复杂度分析:

  • 时间复杂度: O ( m × n ) O(m \times n) O(m×n),其中 m m m n n n分别是岛屿数组的行数和列数。
  • 空间复杂度: O ( m i n ( m , n ) ) O(min(m, n)) O(min(m,n)),在最坏情况下,整个网格均为陆地,队列的大小可以达到 m i n ( m , n ) min(m, n) min(m,n)

二、695、岛屿的最大面积

在这里插入图片描述

2.1 深度优先搜索DFS

  思路分析:在200题岛屿数量的基础之上,题目要求我们求岛屿的最大面积,单块陆地的面积为1。思路很简单,每次遍历之后面积计数器++,然后在不同陆地的面积之中取最大值。
  程序如下

// 695、岛屿的最大面积-深度优先搜索
class Solution3 {
private:int maxArea = 0;int Area = 0;vector<vector<int>> delta_x_y = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };	// 上下左右四个方向的偏移量void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {	// 1、递归输入参数// 2、终止条件 访问过或者遇到海水if (visited[x][y] || grid[x][y] == 0) return;	visited[x][y] = true;Area++;// 3、单层递归逻辑for (int i = 0; i < 4; i++) {int nextx = x + delta_x_y[i][0];int nexty = y + delta_x_y[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过 dfs(grid, visited, nextx, nexty);}}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {vector<vector<bool>> visited = vector<vector<bool>>(grid.size(), vector<bool>(grid[0].size(), false));	// 遍历过的坐标for (int i = 0; i < grid.size(); i++) {	// 遍历行for (int j = 0; j < grid[0].size(); j++) {	// 遍历列if (!visited[i][j] && grid[i][j] == 1) {Area = 0;dfs(grid, visited, i, j);	// 深度优先搜索,将连接的陆地都标记上truemaxArea = max(Area, maxArea);					}}}return maxArea;}
};
  • 时间复杂度: O ( m × n ) O(m \times n) O(m×n),其中 m m m n n n分别是岛屿数组的行数和列数。
  • 空间复杂度: O ( m × n ) O(m \times n) O(m×n),主要是栈的调用,最坏情况下,网格全是陆地,深度优先搜索的深度达到 m × n m \times n m×n

2.2 广度优先搜索BFS

  思路分析:思路和深度优先搜索一样。
  程序如下

// 695、岛屿的最大面积-广度优先搜索
class Solution4 {
private:int maxArea = 0;int Area = 0;vector<vector<int>> delta_x_y = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };	// 上下左右四个方向的偏移量void bfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que; // 定义队列,队列中的元素是对组 pair<int, int>que.push({ x, y }); // 起始节点加入队列visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点Area++;while (!que.empty()) { // 开始遍历队列里的元素pair<int, int> cur = que.front(); que.pop(); // 从队列取元素int curx = cur.first;int cury = cur.second; // 当前节点坐标for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历int nextx = curx + delta_x_y[i][0];int nexty = cury + delta_x_y[i][1]; // 获取周边四个方向的坐标if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 如果节点没被访问过que.push({ nextx, nexty });  // 队列添加该节点为下一轮要遍历的节点visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问Area++;}}}}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {vector<vector<bool>> visited = vector<vector<bool>>(grid.size(), vector<bool>(grid[0].size(), false));	// 遍历过的坐标for (int i = 0; i < grid.size(); i++) {	// 遍历行for (int j = 0; j < grid[0].size(); j++) {	// 遍历列if (!visited[i][j] && grid[i][j] == 1) {Area = 0;bfs(grid, visited, i, j);	// 深度优先搜索,将连接的陆地都标记上truemaxArea = max(Area, maxArea);}}}return maxArea;}
};

复杂度分析:

  • 时间复杂度: O ( m × n ) O(m \times n) O(m×n),其中 m m m n n n分别是岛屿数组的行数和列数。
  • 空间复杂度: O ( m i n ( m , n ) ) O(min(m, n)) O(min(m,n)),在最坏情况下,整个网格均为陆地,队列的大小可以达到 m i n ( m , n ) min(m, n) min(m,n)

三、完整代码

# include <iostream>
# include <vector>
# include <queue>
using namespace std;// 200、岛屿数量-深度优先搜索
class Solution {
private:int result = 0;vector<vector<int>> delta_x_y = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };	// 上下左右四个方向的偏移量void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {	// 1、递归输入参数// 3、单层递归逻辑for (int i = 0; i < 4; i++) {int nextx = x + delta_x_y[i][0];int nexty = y + delta_x_y[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过 2、终止条件if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 没有访问过的,同时是陆地的visited[nextx][nexty] = true;dfs(grid, visited, nextx, nexty);}}		}
public:int numIslands(vector<vector<char>>& grid) {vector<vector<bool>> visited = vector<vector<bool>>(grid.size(), vector<bool>(grid[0].size(), false));	// 遍历过的坐标for (int i = 0; i < grid.size(); i++) {	// 遍历行for (int j = 0; j < grid[0].size(); j++) {	// 遍历列if (!visited[i][j] && grid[i][j] == '1') {visited[i][j] = true;	// 遍历的陆地标记改为trueresult++;		// 遇到没访问过的陆地,岛屿数量++dfs(grid, visited, i, j);	// 深度优先搜索,将连接的陆地都标记上true}}}return result;}
};// 200、岛屿数量-广度优先搜索
class Solution2 {
private:int result = 0;vector<vector<int>> delta_x_y = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };	// 上下左右四个方向的偏移量void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que; // 定义队列,队列中的元素是对组 pair<int, int>que.push({ x, y }); // 起始节点加入队列visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点while (!que.empty()) { // 开始遍历队列里的元素pair<int, int> cur = que.front(); que.pop(); // 从队列取元素int curx = cur.first;int cury = cur.second; // 当前节点坐标for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历int nextx = curx + delta_x_y[i][0]; int nexty = cury + delta_x_y[i][1]; // 获取周边四个方向的坐标if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 如果节点没被访问过que.push({ nextx, nexty });  // 队列添加该节点为下一轮要遍历的节点visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问}}}}
public:int numIslands(vector<vector<char>>& grid) {vector<vector<bool>> visited = vector<vector<bool>>(grid.size(), vector<bool>(grid[0].size(), false));	// 遍历过的坐标for (int i = 0; i < grid.size(); i++) {	// 遍历行for (int j = 0; j < grid[0].size(); j++) {	// 遍历列if (!visited[i][j] && grid[i][j] == '1') {visited[i][j] = true;	// 遍历的陆地标记改为trueresult++;		// 遇到没访问过的陆地,岛屿数量++bfs(grid, visited, i, j);	// 深度优先搜索,将连接的陆地都标记上true}}}return result;}
};// 695、岛屿的最大面积-深度优先搜索
class Solution3 {
private:int maxArea = 0;int Area = 0;vector<vector<int>> delta_x_y = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };	// 上下左右四个方向的偏移量void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {	// 1、递归输入参数// 2、终止条件 访问过或者遇到海水if (visited[x][y] || grid[x][y] == 0) return;	visited[x][y] = true;Area++;// 3、单层递归逻辑for (int i = 0; i < 4; i++) {int nextx = x + delta_x_y[i][0];int nexty = y + delta_x_y[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过 dfs(grid, visited, nextx, nexty);}}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {vector<vector<bool>> visited = vector<vector<bool>>(grid.size(), vector<bool>(grid[0].size(), false));	// 遍历过的坐标for (int i = 0; i < grid.size(); i++) {	// 遍历行for (int j = 0; j < grid[0].size(); j++) {	// 遍历列if (!visited[i][j] && grid[i][j] == 1) {Area = 0;dfs(grid, visited, i, j);	// 深度优先搜索,将连接的陆地都标记上truemaxArea = max(Area, maxArea);					}}}return maxArea;}
};// 695、岛屿的最大面积-广度优先搜索
class Solution4 {
private:int maxArea = 0;int Area = 0;vector<vector<int>> delta_x_y = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };	// 上下左右四个方向的偏移量void bfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que; // 定义队列,队列中的元素是对组 pair<int, int>que.push({ x, y }); // 起始节点加入队列visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点Area++;while (!que.empty()) { // 开始遍历队列里的元素pair<int, int> cur = que.front(); que.pop(); // 从队列取元素int curx = cur.first;int cury = cur.second; // 当前节点坐标for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历int nextx = curx + delta_x_y[i][0];int nexty = cury + delta_x_y[i][1]; // 获取周边四个方向的坐标if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 如果节点没被访问过que.push({ nextx, nexty });  // 队列添加该节点为下一轮要遍历的节点visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问Area++;}}}}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {vector<vector<bool>> visited = vector<vector<bool>>(grid.size(), vector<bool>(grid[0].size(), false));	// 遍历过的坐标for (int i = 0; i < grid.size(); i++) {	// 遍历行for (int j = 0; j < grid[0].size(); j++) {	// 遍历列if (!visited[i][j] && grid[i][j] == 1) {Area = 0;bfs(grid, visited, i, j);	// 深度优先搜索,将连接的陆地都标记上truemaxArea = max(Area, maxArea);}}}return maxArea;}
};int main() {// // 200、岛屿数量测试案例//vector<vector<char>> grid = { {'1', '1', '1', '1', '0'} ,{'1', '1', '0', '1', '0'}, {'1', '1', '0', '0', '0'}, {'0', '0', '0', '0', '0'} };	//Solution s1;//int result = s1.numIslands(grid);// 695、岛屿的最大面积测试案例vector<vector<int>> grid = { {0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, { 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 } };Solution4 s1;int result = s1.maxAreaOfIsland(grid);cout << result << endl;system("pause");return 0;
}

end

http://www.mmbaike.com/news/41583.html

相关文章:

  • 上海营销型网站建站seo博客写作
  • 建造自己的网站网站seo李守洪排名大师
  • 做网站是三网合一有什么优势企业查询网
  • 湛江本地做网站附近的电脑培训班在哪里
  • 为什么做动漫短视频网站企业培训的目的和意义
  • 定制vx怎么弄搜索引擎优化网站
  • 做网站设计哪家好微博推广方法有哪些
  • dede手机网站模板哦亚马逊关键词优化软件
  • 餐饮行业网站建设关键词搜索引擎工具
  • 做民宿的网站武汉seo霸屏
  • 商城网站是免费开吗网站排名优化培训哪家好
  • 电子网站建设策划模板百度推广好做吗
  • 网站模板分类营销顾问公司
  • 用服务器ip做网站模板免费下载网站
  • 网站群 主要功能怎么把广告发到各大平台
  • 简单网页模板下载优化大师app下载
  • 131美女做爰视频网站淮北网络推广
  • php网站开发外文翻译无忧seo博客
  • 安阳做网站推广最好的公司如何做好营销
  • 全屋装修公司网站seo搜索引擎优化怎么做
  • 男女做的那个视频网站百度搜索关键词排名优化技术
  • 小米商城官方网站入口网站建设报价单模板
  • 做家装模型的效果图网站足球排名最新排名世界
  • 毕业设计做网站 答辩会问什么问题下载百度安装到桌面
  • 广州 骏域网站建设专家windows优化大师值得买吗
  • 长沙微网站建设百度是国企还是央企
  • 网站建设金华太原seo全网营销
  • 网络公司网站建设app推广方法
  • wordpress后台登不了是什么原因seo营销推广多少钱
  • 唐山seo网站建设账户竞价托管哪里好