1、岛屿数量
java
public int numIslands(char[][] grid) {
int m = grid.length,n = grid[0].length;
int res = 0;
for (int i = 0 ;i < m;i++){
for (int j = 0 ;j < n;j++){
if(grid[i][j] == '1'){//如果遇到了陆地
res++;//陆地数量++
dfs(grid,i,j);//递归该陆地有多大
}
}
}
return res;
}
public void dfs(char[][] grid,int l,int r){
int m = grid.length,n = grid[0].length;
if(l < 0 || r >= n || l >= m || r < 0 || grid[l][r] == '0')//如果当前的坐标超出了网格范围,则返回
return;
grid[l][r] = '0';//将当前的陆地设置为0,避免再次被访问到
//递归当前坐标为中心的四个方向,将四个方向中值是1的位置,都设置为0,避免下次被扫描到
dfs(grid,l - 1,r);
dfs(grid,l,r - 1);
dfs(grid,l + 1,r);
dfs(grid,l,r + 1);
}
2、腐烂的橘子
java
public int orangesRotting(int[][] grid) {
int m = grid.length,n = grid[0].length;
int count = 0;
Queue<int[]> queue = new LinkedList<>();
for(int i = 0 ;i < m;i++){
for(int j = 0 ;j < n;j++){
if(grid[i][j] == 1){//计算所有的好橘子数量
count++;
}else if(grid[i][j] == 2){//将所有的腐烂中心加入队列里
queue.add(new int[]{i,j});
}
}
}
int res = 0;
while (count > 0 && !queue.isEmpty()){
res++;//每腐烂一圈橘子,分钟数++
int size = queue.size();
for(int i = 0;i < size;i++){
int[] a = queue.poll();//拿出当前的腐烂橘子
int l = a[0];
int r = a[1];
//遍历当前腐烂橘子的四周,如果是好橘子,则修改为腐烂的,并将修改后的橘子加入到队列里,作为新的腐烂中心
if(l - 1 >= 0 && grid[l - 1][r] == 1){
count--;
grid[l - 1][r] = 2;
queue.add(new int[]{l - 1,r});
}
if(l + 1 < m && grid[l + 1][r] == 1){
count--;
grid[l + 1][r] = 2;
queue.add(new int[]{l + 1,r});
}
if(r - 1 >= 0 && grid[l][r - 1] == 1){
count--;
grid[l][r - 1] = 2;
queue.add(new int[]{l,r - 1});
}
if(r + 1 < n && grid[l][r + 1] == 1){
count--;
grid[l][r + 1] = 2;
queue.add(new int[]{l,r + 1});
}
}
}
if(count > 0)//如果好橘子没有被腐烂完,则返回-1
return -1;
return res;
}
3、课程表
java
public boolean canFinish(int numCourses, int[][] prerequisites) {
//记录每一门课的入度
int[] inDegree = new int[numCourses];
//记录依赖该门课程的其他测成列表
List<List<Integer>> list = new ArrayList<>();
for(int i = 0; i < numCourses;i++){
list.add(new ArrayList<>());
}
//初始化每一门课的入度和依赖该门课程的列表
for(int[] pre : prerequisites){
int course = pre[0];
int precoures = pre[1];
inDegree[course]++;
list.get(precoures).add(course);
}
//存储入度为0的课程队列
Queue<Integer> queue = new LinkedList<>();
for (int i = 0 ;i < numCourses;i++){
if(inDegree[i] == 0)
queue.add(i);
}
//记录完成的课程数量
int count = 0;
while (!queue.isEmpty()){
int sourse = queue.poll();
count++;
//获取当前课程的后缀课程列表
List<Integer> list1 = list.get(sourse);
//将该列表中的课程入度减一
for(int k : list1){
inDegree[k]--;
if(inDegree[k] == 0)//如果减一后的入度为0,那么加入队列,表明该课程可以被访问了
queue.add(k);
}
}
//当上完的课程等于应该要上的课程时,说明可以完成所有课程
return count == numCourses;
}