leetcode 2026-03-04 每日一练 - 统计特殊位置

leetcode 2026-03-04 每日一练 - 统计特殊位置
Austoin题目描述
LeetCode 1582. 二进制矩阵中的特殊位置
给定一个 m x n 的二进制矩阵 mat,返回矩阵 mat 中特殊位置的数量。
如果位置 (i, j) 满足 mat[i][j] == 1 并且行 i 与列 j 中的所有其他元素都是 0(行和列的下标从 0 开始计数),那么它被称为特殊位置。
示例:
- 输入:
mat = [[1,0,0],[0,0,1],[1,0,0]] - 输出:
1 - 解释:位置
(1, 2)是一个特殊位置,因为mat[1][2] == 1且第1行和第2列的其他所有元素都是0
解题思路
核心观察
特殊位置需要同时满足两个条件:
- 该位置的值为
1 - 该位置所在的行和列中,只有这一个
1,其他都是0
优化策略
如果直接暴力检查每个位置,需要对每个 1 都遍历整行整列,时间复杂度会达到 O(m² × n²)。
优化思路:预处理每行和每列的 1 的个数
- 第一次遍历:统计每行和每列的
1的总数 - 第二次遍历:检查每个
1所在的行和列是否都只有一个1
这样时间复杂度降低到 O(m × n)。
算法步骤
- 创建两个数组
rows和cols,分别记录每行和每列的1的个数 - 第一次遍历矩阵,统计每行每列的
1的数量 - 第二次遍历矩阵,对于每个值为
1的位置(i, j):- 如果
rows[i] == 1且cols[j] == 1,说明这是特殊位置 - 计数器加
1
- 如果
代码实现
方法一:预处理行列和(推荐)
1 | func numSpecial(mat [][]int) (ans int) { |
方法二:记录索引(备选)
1 | func numSpecial(mat [][]int) (ans int) { |
核心细节
- 边界处理:检查矩阵是否为空(
m == 0) - 预处理优化:通过一次遍历统计行列和,避免重复计算
- 条件判断:
mat[i][j] == 1 && rows[i] == 1 && cols[j] == 1三个条件缺一不可 - 空间换时间:使用
O(m + n)的额外空间换取O(m × n)的时间复杂度
复杂度分析
方法一
- 时间复杂度:
O(m × n),需要遍历矩阵两次 - 空间复杂度:
O(m + n),需要存储每行每列的统计信息
方法二
- 时间复杂度:
O(m × n),同样需要遍历矩阵 - 空间复杂度:
O(m + n),最坏情况下所有行列都只有一个1
方法对比
| 方法 | 优点 | 缺点 |
|---|---|---|
| 方法一 | 代码简洁,逻辑清晰 | 需要遍历两次矩阵 |
| 方法二 | 提前过滤,减少检查次数 | 代码较复杂,需要额外函数 |
推荐使用方法一,代码更简洁易懂。
总结
这道题的关键点:
- 理解特殊位置的定义:该位置为
1,且所在行列只有这一个1 - 预处理优化:先统计行列和,再检查条件
- 空间换时间:使用额外数组存储统计信息
- 两次遍历:第一次统计,第二次检查













