hot100-一刷-09图论(共4道题)
200. 岛屿数量
题目描述
代码实现
分析:
dfs
代码:
class Solution {
public int numIslands(char[][] grid) {
int ans = 0;
for (int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if (grid[i][j] == '1'){
dfs(grid, i, j);
ans++;
}
}
}
return ans;
}
private void dfs(char[][] grid, int i, int j){
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] != '1'){
return;
}
grid[i][j] = '2';
dfs(grid, i, j -1);
dfs(grid, i, j +1);
dfs(grid, i-1 , j );
dfs(grid, i +1, j);
}
}
994. 腐烂的橘子
题目描述
代码实现
分析:
- BFS
代码:
class Solution {
// 感染方向
private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public int orangesRotting(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int fresh = 0;
List<int[]> q = new ArrayList<>();
// 统计初始腐烂橘子和新鲜橘子
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
if(grid[i][j] == 1){
fresh++;
}else if(grid[i][j] == 2){
q.add(new int[]{i, j});
}
}
}
// BFS模拟腐烂过程
int ans = 0;
while(fresh > 0 && !q.isEmpty()){
ans++;
List<int[]> temp = q;
q = new ArrayList<>();
// 对该时刻的所有腐烂橘子进行BFS
for(int[] pos : temp){
// 查找四个方向
for (int[] d : DIRECTIONS){
int i = pos[0] + d[0];
int j = pos[1] + d[1];
// 感染新鲜橘子
if(i >= 0 && i < m && j >=0 && j < n && grid[i][j] == 1){
fresh--;
// 添加到下一时刻需要遍历的队列中
q.add(new int[]{i, j});
// 标记为腐烂
grid[i][j] = 2;
}
}
}
}
return fresh > 0 ? -1 : ans;
}
}
207. 课程表
题目描述
代码实现
分析:
代码:
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
// 构建图g, 长度为课程数
List<Integer>[] g = new ArrayList[numCourses];
Arrays.setAll(g, i -> new ArrayList<>());
for (int[] p : prerequisites){
// 初始化连接
g[p[1]].add(p[0]);
}
int[] colors = new int[numCourses];
// 对每个入口dfs找环
for (int i = 0; i < numCourses; i++){
if (colors[i] == 0 && dfs(i, g, colors)){
return false; //有环
}
}
return true;
}
private boolean dfs(int x, List<Integer>[] g, int[] colors){
colors[x] = 1; // x正在访问中
for (int y : g[x]){
if(colors[y] == 1 || colors[y] == 0 && dfs(y, g, colors)){
return true; // 找到环
}
}
colors[x] = 2; // x这个入口完全dfs完了,没找到环
return false;
}
}
208. 实现 Trie (前缀树)
题目描述
代码实现
分析:
代码:
class Node {
Node[] son = new Node[26];
boolean end;
}
class Trie {
private Node root;
public Trie() {
root = new Node();
}
public void insert(String word) {
Node cur = root;
for (char c : word.toCharArray()){
c -= 'a';
if(cur.son[c] == null){
cur.son[c] = new Node();
}
cur = cur.son[c];
}
cur.end = true;
}
public boolean search(String word) {
return find(word)==1;
}
public boolean startsWith(String prefix) {
return find(prefix) != 0;
}
private int find(String word){
Node cur = root;
for(char c : word.toCharArray()){
c -= 'a';
if(cur.son[c] == null){
// 没有找到
return 0;
}
cur = cur.son[c];
}
return cur.end ? 1 : 2;
}
}
本文来自博客园,作者:chendsome,转载请注明原文链接:https://www.cnblogs.com/chendsome/p/18612209