【算法与数据结构】200、695、LeetCode岛屿数量(深搜+广搜) 岛屿的最大面积

文章目录

  • 一、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;	// 遍历的陆地标记改为true
					result++;		// 遇到没访问过的陆地,岛屿数量++
					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;	// 遍历的陆地标记改为true
					result++;		// 遇到没访问过的陆地,岛屿数量++
					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);	// 深度优先搜索,将连接的陆地都标记上true
					maxArea = 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);	// 深度优先搜索,将连接的陆地都标记上true
					maxArea = 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;	// 遍历的陆地标记改为true
					result++;		// 遇到没访问过的陆地,岛屿数量++
					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;	// 遍历的陆地标记改为true
					result++;		// 遇到没访问过的陆地,岛屿数量++
					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);	// 深度优先搜索,将连接的陆地都标记上true
					maxArea = 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);	// 深度优先搜索,将连接的陆地都标记上true
					maxArea = 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第三百五十八回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容&#xff0c;本章回中将介绍wheelChoose组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念…

ChatGPT丨成像光谱遥感技术中的AI革命:ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

解决弹性布局父元素设置高自动换行,子元素均分高度问题(align-content: flex-start)

案例&#xff1a; <view class"abc"><view class"abc-item" v-for"(item,index) in 8" :key"index">看我</view> </view> <style lang"less">.abc{height: 100px;display: flex;flex-wrap: …

[ Python+OpenCV+Mediapipe ] 实现对象识别

一、写在前面 本文所用例子为个人学习的小结&#xff0c;如有不足之处请各位多多海涵&#xff0c;欢迎小伙伴一起学习进步&#xff0c;如果想法可在评论区指出&#xff0c;我会尽快回复您&#xff0c;不胜感激&#xff01; 所公布代码或截图均为运行成功后展示。 二、本文内容…

【设计模式】使用适配器模式做补偿设计

文章目录 1.概述2.两种适配器模式2.1.类适配器2.2.对象适配器 3.总结 1.概述 适配器模式是一种结构型设计模式&#xff0c;它提供了一个中间层&#xff0c;通过这个中间层&#xff0c;客户端可以使用统一的接口与具有不同接口的类进行交互&#xff0c;也就是说&#xff0c;将一…

Sora横空出世!AI将如何撬动未来?

近日&#xff0c;OpenAI 发布首个视频生成“Sora”模型&#xff0c;该模型通过接收文字指令&#xff0c;即可生成60秒的短视频。 而在2022年末&#xff0c;同样是OpenAI发布的AI语言模型ChatGPT&#xff0c;简化了文本撰写、创意构思以及代码校验等任务。用户仅需输入一个指令&…

1.30数据包络法

数据包络分析法&#xff08;Data Envelopment Analysis&#xff0c;DEA&#xff09;是一种非参数的效率评价方法&#xff0c;用于衡量相对效率和评估多个决策单元&#xff08;DMU&#xff09;的绩效。 在数据包络分析中&#xff0c;每个决策单元都是一个输入和输出数据向量的组…

[Angular 基础] - service 服务

[Angular 基础] - service 服务 之前的笔记就列举三个好了……没想到 Angular 东西这么多(&#xff70; &#xff70;;)……全加感觉越来越凑字数了 [Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递 [Angular 基础] - 生命周期函数 [Angular 基础] - 自…

Android T 远程动画显示流程其二——动画的添加流程(更新中)

前言 接着上篇文章分析 Android T 远程动画显示流程其一 切入点——处理应用的显示过渡 下面&#xff0c;我们以从桌面点击一个应用启动的场景来分析远程动画的流程&#xff0c;窗口添加的流程见Android T WMS窗口相关流程 这里我们从AppTransitionController.handleAppTran…

量子加密机的工作原理是什么

量子加密机&#xff0c;作为现代加密技术的一大飞跃&#xff0c;正逐渐成为信息安全领域的研究热点。与传统的加密方法相比&#xff0c;量子加密技术以其独特的优势&#xff0c;为信息安全提供了更为坚实的保障。 量子加密的核心在于利用量子力学的特性&#xff0c;尤其是量子纠…

sizeof()的易错点

你也可以传入一个变量的名字&#xff08;而不只是类型&#xff09;给 sizeof()&#xff0c;但在一些情况下&#xff0c;可能得不到你要的结果&#xff0c;所以要小心使用。例如&#xff0c;看看下面的代码片段&#xff1a; 在第一行&#xff0c;我们为 10 个整数的数组声明了空…

LInux-信号1

文章目录 前言一、信号是什么&#xff1f;二、学习步骤使用kill -l命令查看信号列表可以看到有那么多信号&#xff0c;那么进程是如何识别这么多信号的呢&#xff1f; 使用kill命令终止进程信号的捕捉kill函数raise函数abort函数 Core dump如何查看自己的核心转储功能是否被打开…

C++运算符重载、迭代器、继承、派生类的构造与析构、重载、隐藏和覆盖

运算符重载 普通的C运算符重载成员方法基本都知道&#xff0c;如果没有定义成员方法&#xff0c;那么编译器会优先寻找全局重载运算符看看是否匹配。这里给出了一个使用友元函数和全局重载运算符来实现整数与复数类对象的相加运算。 #include <iostream>class Complex …

Flink双流(join)

一、介绍 Join大体分类只有两种&#xff1a;Window Join和Interval Join Window Join有可以根据Window的类型细分出3种&#xff1a;Tumbling(滚动) Window Join、Sliding(滑动) Window Join、Session(会话) Widnow Join。 &#x1f338;Window 类型的join都是利用window的机制…

蜂鸣器实验

1.有源蜂鸣器简介 蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中&#xff0c;常用的蜂鸣器有两种&#xff1a; 有源蜂鸣器和无源蜂鸣器&#xff0c;这里的有“源”不是电源&#xff0c;而是震荡源&#xff0c;有源蜂鸣器内部带有震荡 源&#xff0c;所以有源蜂…

OD(8)之Mermaid流程图(flowcharts)使用详解

OD(8)之Mermaid流程图(flowcharts)使用详解 Author: Once Day Date: 2024年2月20日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool‍…

Maven 私服 Nexus3

一、Maven和Nexus3 简介 Maven是一个采用纯Java编写的开源项目管理工具&#xff0c;采用一种被称之为Project Object Model(POM)概念来管理项目&#xff0c;所有的项目配置信息都被定义在一个叫做POM.xml的文件中, 通过该文件Maven可以管理项目的整个生命周期&#xff0c;包括…

maven 打包命令

Maven是基于项目对象模型(POM project object model)&#xff0c;可以通过一小段描述信息&#xff08;配置&#xff09;来管理项目的构建&#xff0c;报告和文档的软件项目管理工具。 Maven的核心功能便是合理叙述项目间的依赖关系&#xff0c;通俗点讲&#xff0c;就是通过po…

06 分频器设计

分频器简介 实现分频一般有两种方法&#xff0c;一种方法是直接使用 PLL 进行分频&#xff0c;比如在 FPGA 或者 ASIC 设计中&#xff0c;都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性&#xff0c;无法得到频率很低的时钟信号&#xff0c;比如输入 …

Predis Multi-Zone

A Data Flow Framework with High Throughput and Low Latency for Permissioned Blockchains 联盟链的吞吐瓶颈由共识层和网络层的数据分发过程共同决定。 Predis 协议利用了共识节点的空闲带宽&#xff0c;提前分发区块中的内容即bundle&#xff0c;减少了共识区块中的内容&…