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

LeetCode 解题思路 26(Hot 100)

在这里插入图片描述

解题思路:

  1. 遍历网格: 逐个检查每个单元格。
  2. 发现陆地: 当遇到值为 ‘1’ 的单元格时,表示发现新岛屿,计数器加 1。
  3. 标记访问: 从当前单元格出发,递归访问其上下左右相邻的陆地,并将它们标记为已访问。
  4. 重复过程: 继续遍历网格直至所有单元格处理完毕。

Java代码:

class Solution {
    public int numIslands(char[][] grid) {
        int count = 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);
                    count++;
                }
            }
        }

        return count;
    }

    private void dfs(char[][] grid, int i, int j) {
        if (i == -1 || i == grid.length || j == -1 || j == grid[0].length || grid[i][j] != '1') return;
        
        grid[i][j] = '0';
        dfs(grid, i + 1, j);
        dfs(grid, i - 1, j);
        dfs(grid, i, j + 1);
        dfs(grid, i, j - 1);
    }
}

复杂度分析:

  • 时间复杂度: O(mn)。其中 m 是行数,n 是列数。每个单元格最多被访问一次。
  • 空间复杂度: O(mn)。最坏情况下(如网格全为陆地),递归深度可达 mn。

在这里插入图片描述

解题思路:

  1. ​初始化: 首先遍历整个网格,统计所有新鲜橘子的数量,并将所有初始腐烂橘子的位置加入队列。
  2. ​BFS 扩散: 从队列中取出腐烂橘子的位置,检查其四个方向的新鲜橘子,将其腐烂并加入队列。每次处理完一层腐烂橘子(即 BFS 的一层),时间增加一分钟。
  3. 终止条件: 当队列为空时,检查是否还有新鲜橘子。如果没有,返回总时间;否则返回 -1,表示无法全部腐烂。

Java代码:

class Solution {
    public int orangesRotting(int[][] grid) {
        Queue<int[]> queue = new LinkedList<>();
        int freshOranges = 0;

        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 2) {
                    queue.offer(new int[]{i, j});
                } else if (grid[i][j] == 1) {
                    freshOranges++;
                }
            }
        }

        if (freshOranges == 0) return 0;

        int[][] directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
        int minutes = 0;

        while (!queue.isEmpty()) {
            int size = queue.size();
            boolean changed = false;

            for (int i = 0; i < size; i++) {
                int[] current = queue.poll();
                int x = current[0], y = current[1];

                for (int[] dir : directions) {
                    int newX = x + dir[0];
                    int newY = y + dir[1];

                    if (newX >= 0 && newX < grid.length && newY >= 0 && newY < grid[0].length && grid[newX][newY] == 1) {
                        grid[newX][newY] = 2;
                        queue.offer(new int[]{newX, newY});
                        freshOranges--;
                        changed = true;
                    }
                } 
            }

            if (changed) minutes++;
        }

        return freshOranges == 0 ? minutes : -1;
    }
}

复杂度分析:

  • 时间复杂度: O(mn)。其中 m 是行数,n 是列数。每个单元格最多被访问一次。
  • 空间复杂度: O(mn)。最坏情况下(如网格全为腐烂橘子),递归深度可达 mn。

相关文章:

  • 计算机网络基础:量子通信技术在网络中的应用前景
  • js文字两端对齐
  • 蓝桥杯第10届 后缀表达式
  • Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·中】
  • Intellij IDEA2023 创建java web项目
  • 修改菜品-01.需求分析与设计
  • Android15查看函数调用关系
  • 使用string和string_view(二)——数值转换、std::string_view和非标准字符串
  • 华为、浪潮、华三链路聚合概述
  • 蓝桥杯 第十二天 819 递增序列
  • dubbo自定义扩展
  • Redis常见面试问题汇总
  • 【deepseek 学c++】weakptr引用场景
  • HBase在Hadoop平台上的安装和配置
  • Blender多边形填充问题
  • 00.【Linux系统编程】 Linux初识(云服务器设置CentOS并使用、Xshell链接云服务器)
  • Qt弹出新窗口并关闭(一个按钮)
  • Leetcode 四数之和
  • IEEE PDF Xpress校验出现 :字体无法嵌入问题以及pdf版本问题
  • docker中安装 python
  • 长春模板建站公司/成都网络营销公司
  • 招聘网站建设人员/百度信息流是什么
  • 网站建设顾问英语/营销管理系统
  • 做php网站教程视频教程/沧州搜索引擎优化
  • 电子商务网站策划方案/宁波seo排名外包公司
  • 北京西站附近的景点有哪些/天津百度网络推广