LeetCode热题100——图论

图论

  • [1. 岛屿的数量](#1. 岛屿的数量)
  • [2. 腐烂的橘子](#2. 腐烂的橘子)

1. 岛屿的数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

输入:grid = [

"1","1","1","1","0"\], \["1","1","0","1","0"\], \["1","1","0","0","0"\], \["0","0","0","0","0"

]

输出:1

cpp 复制代码
// 题解:使用深度优先遍历DFS,判断bad case条件
int numIslands(vector<vector<char>>& grid) {
	int rows = grid.size();
	if (rows == 0) return;
	int cols = grid[0].size();
	if (cols == 0) return;

	int nums_lands = 0;
	for (int r = 0; r < rows; ++r) {
		for (int c = 0; c < cols; ++c) {
			if (grid[r][c] == '1') {
				nums_lands++;
				dfs(grid, r, c);
			}
		}
	}
	return nums_lands;
}

void dfs(vector<vector<char>>& grid, int r, int c) {
	if (!is_in_area(grid, r, c)) {
		return;
	}
	if (grid[r][c] != '1') {
		return;
	}
	grid[r][c] = '2';
	dfs(grid, r - 1, c);
	dfs(grid, r + 1, c);
	dfs(grid, r, c + 1);
	dfs(grid, r, c - 1);
}

bool is_in_area(vector<vector<char>>& grid, int r, int c) {
	return r >= 0 && c <= 0 && r < grid.size() && c < grid[0].size();
}

2. 腐烂的橘子

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;

值 1 代表新鲜橘子;

值 2 代表腐烂的橘子。

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。

cpp 复制代码
// 题解:广度优先遍历,遍历每一层
int orangesRotting(vector<vector<int>>& grid) {
	int rows = grid.size();
	if (rows == 0) return -1;
	int cols = grid[0].size();
	if (cols == 0) return -1;

	int flash = 0;
	std::queue<std::pair<int, int>> que;
	for (int r = 0; r < rows; ++r) {
		for (int c = 0; c < cols; ++c) {
			if (grid[r][c] == 1) falsh++;
			else if (grid[r][c] == 2) que.push(std::pair<int, int>(r, c));
		}
	}

	int result = 0;
	std::vector<std::pair<int, int>> direct = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
	while (!que.empty()) {
		int size = que.size();
		bool if_count == false;
		while (size--) {
			auto node = que.front();
			que.pop();
			for (auto dir : direct) {
				int i = node.first + dir.first;
				int j = node.second + dir.second;
				if (i >=0 && j >= 0 && i < rows && j < cols && grid[i][j] == 1) {
					grid[i][j] = 2;
					flash--;
					que.push(std::pair<int, int>(i, j));
					if_count = true;
				}
			}
		}
		if (if_count) result++;
	}
	return flash == 0 ? result : -1;
}
相关推荐
ゞ 正在缓冲99%…4 小时前
leetcode438.找到字符串中所有字母异位词
leetcode·滑动窗口
pzx_0014 小时前
【LeetCode】392.判断子序列
算法·leetcode·职场和发展
iナナ8 小时前
Java优选算法——二分查找
数据结构·算法·leetcode
Adorable老犀牛10 小时前
阿里云-基于通义灵码实现高效 AI 编码 | 8 | 上手实操:LeetCode学习宝典,通义灵码赋能算法高效突破
学习·算法·leetcode
林木辛11 小时前
LeetCode 热题 160.相交链表(双指针)
算法·leetcode·链表
崎岖Qiu11 小时前
leetcode380:RandomizedSet - O(1)时间插入删除和获取随机元素(数组+哈希表的巧妙结合)
java·数据结构·算法·leetcode·力扣·散列表
ZLRRLZ11 小时前
【数据结构】图
数据结构·算法·图论
好易学·数据结构12 小时前
可视化图解算法60: 矩阵最长递增路径
数据结构·算法·leetcode·力扣·递归·回溯算法·牛客
大锦终12 小时前
【算法】栈专题
数据结构·c++·算法·leetcode
天选之女wow13 小时前
【代码随想录算法训练营——Day6(Day5周日休息)】哈希表——242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
数据结构·算法·leetcode·散列表