讲师中心 微信公众号
AI工具推荐 视频效率加速

高效统计二维数组中与1相邻的唯一0元素个数——边界邻接零计数算法详解

冬萱姑娘_6646

冬萱姑娘_6646

发布时间:2026-02-22 09:21:22

|

286人浏览过

|

来源于php中文网

原创

高效统计二维数组中与1相邻的唯一0元素个数——边界邻接零计数算法详解

本文介绍一种鲁棒、无越界风险的算法,用于统计二维二进制数组中至少与一个1正交相邻(上/下/左/右)的0元素个数,每个0仅计一次,即使被多个1包围。

本文介绍一种鲁棒、无越界风险的算法,用于统计二维二进制数组中**至少与一个1正交相邻(上/下/左/右)的0元素个数**,每个0仅计一次,即使被多个1包围。

在处理二维二进制数组的邻域分析任务时,一个常见但易错的需求是:找出所有“被1包围”的0——即该0的上下左右四个正交方向中至少存在一个1;同时要求每个这样的0只计数一次(去重),无论它毗邻1的数量是1个还是4个。初学者常采用“遍历1、检查其邻居”的思路,却极易因边界判断疏漏引发 ArrayIndexOutOfBoundsException,或因重复计数导致结果偏高。

正确的解题策略应以0为观察主体,逐个检查每个0是否满足“邻接1”的条件。这种方法天然规避越界风险(只需对每个0的四个方向做安全索引校验),且天然保证每个0仅被判定一次,完美契合“不重复计数”的核心要求。

以下是完整、健壮、可直接运行的 Java 实现:

public static int borderZeros(int[][] nums) {
    // 边界情况:空数组或单元素数组
    if (nums == null || nums.length == 0) return 0;
    int rows = nums.length;
    int cols = nums[0].length;
    if (rows == 0 || cols == 0) return 0;

    int count = 0;

    // 遍历每一个单元格
    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            // 只关注值为0的单元格
            if (nums[r][c] == 0) {
                boolean adjacentToOne = false;

                // 检查上、下、左、右四个方向(正交邻接)
                // 上
                if (r > 0 && nums[r - 1][c] == 1) adjacentToOne = true;
                // 下
                if (r < rows - 1 && nums[r + 1][c] == 1) adjacentToOne = true;
                // 左
                if (c > 0 && nums[r][c - 1] == 1) adjacentToOne = true;
                // 右
                if (c < cols - 1 && nums[r][c + 1] == 1) adjacentToOne = true;

                if (adjacentToOne) {
                    count++;
                }
            }
        }
    }

    return count;
}

✅ 算法优势说明:

  • 安全无异常:所有方向访问前均进行 r > 0、r
  • 天然去重:每个0仅被访问一次,并在首次确认其邻接1后立即计数,不存在重复累加逻辑;
  • 时间复杂度最优:O(m×n),需遍历全部单元格,不可进一步降低;
  • 空间复杂度最优:O(1),仅使用常量额外空间。

⚠️ 注意事项:

  • 该算法严格遵循题目定义:仅考虑正交(四连通)邻接,不包含对角线方向;
  • 输入数组允许不规则(每行长度不同),代码中通过 nums[r].length 动态获取列数,增强鲁棒性;
  • 若需扩展为支持八连通(含对角线),仅需增加4个方向判断,但本题明确排除该情形。

验证示例:

  • nums1 返回 10,nums2 返回 18,与预期完全一致。
  • 即使输入为 {{0}}、{{1}} 或 null,函数也安全返回 0。

总结而言,本方案摒弃了“从1出发扩散”的易错路径,转而采用“以0为中心、主动探测邻域”的清晰范式。它不仅正确、高效、易理解,更体现了算法设计中“问题建模优先于技巧堆砌”的工程思维——对初学者而言,这是比图论匹配等高级抽象更坚实、更实用的第一课。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6264

2023.10.24

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6567

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2728

2023.08.10

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1947

2023.09.19

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6676

2023.08.14

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn