
本文介绍一种健壮、无越界风险的算法,用于统计二维二进制数组中所有与至少一个1正交相邻(上/下/左/右)的不重复0元素个数,并提供可直接运行的Java实现与关键细节解析。
本文介绍一种健壮、无越界风险的算法,用于统计二维二进制数组中**所有与至少一个1正交相邻(上/下/左/右)的不重复0元素个数**,并提供可直接运行的java实现与关键细节解析。
在处理二维二进制数组(仅含0和1)时,一个常见但易出错的需求是:找出所有“被1包围”的0——即该0的正交四邻域(上下左右)中至少存在一个1,且每个满足条件的0仅计1次,即使它被多个1同时邻接。注意:题目明确要求去重统计(如一个0同时邻接两个1,仍只算1个),且必须规避 ArrayIndexOutOfBoundsException。
直接遍历1并检查其邻居(如提问者初始思路)虽直观,但极易因边界处理不当导致越界;而若改用遍历所有0再检查邻域,则逻辑更清晰、边界更易控制,且天然支持去重(每个0只被访问一次)。
✅ 推荐解法:遍历每个0,检查其四邻是否含1
核心思想:对数组中每个位置 (r, c),若 nums[r][c] == 0,则检查其上 (r-1,c)、下 (r+1,c)、左 (r,c-1)、右 (r,c+1) 四个方向是否存在合法索引且值为1。只要任一方向满足,该0即计入结果,随后立即跳出当前检查(避免重复累加同一0)。
此方法优势显著:
- 零越界风险:每次访问邻居前均校验行列索引有效性;
- 天然去重:每个0最多被计1次;
- 时间复杂度最优:O(m×n),每个元素仅访问常数次;
- 空间复杂度极低:仅需 O(1) 额外空间。
以下是完整、鲁棒的 Java 实现:
public static int borderZeros(int[][] nums) {
// 边界校验:空数组或单元素数组直接返回0
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++) {
if (nums[r][c] == 0) { // 找到一个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;
}? 验证示例输出
- nums1(4×8数组):算法正确返回 10
- nums2(6×6数组):算法正确返回 18
你可将上述方法嵌入主程序测试:
public static void main(String[] args) {
int[][] nums1 = {
{0, 0, 1, 0, 1, 0, 1, 0},
{1, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
};
int[][] nums2 = {
{0, 0, 0, 0, 1, 1},
{0, 1, 0, 0, 1, 0},
{0, 1, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0},
{0, 1, 0, 0, 1, 0},
{0, 0, 0, 0, 1, 1},
};
System.out.println(borderZeros(nums1)); // 输出: 10
System.out.println(borderZeros(nums2)); // 输出: 18
}⚠️ 关键注意事项
- 勿混淆方向逻辑:题目明确排除对角线(如 (r-1,c-1)),仅检查正交四邻;
- 边界判断顺序不可颠倒:务必先检查索引合法性(如 r > 0),再访问数组(如 nums[r-1][c]),否则短路求值失效会导致越界;
- 无需额外数据结构:本题不要求记录具体位置或路径,纯计数场景下布尔标记 + 即时计数是最简方案;
- 图论视角补充说明:虽然答案提及“二分图最大匹配”,但该模型适用于更复杂的关联约束(如一对一配对),而本题本质是存在性判定(∃邻1)+ 集合去重,直接遍历远比建图+匈牙利算法更简洁高效,切勿过度工程化。
掌握此模式后,你可轻松迁移至类似问题:如统计“被障碍物包围的空地”、“与污染源相邻的安全区”等网格邻域分析任务。核心原则始终如一:以目标元素为锚点,安全检查其邻域,用最小开销达成语义准确。










