孤独像素 I 解题分析
一、题目描述
给定一个大小为 m x n
的图像 picture
,图像由黑白像素组成,其中 'B'
表示黑色像素,'W'
表示白色像素。我们需要统计并返回图像中黑色孤独像素的数量。黑色孤独像素的定义为:如果黑色像素 'B'
所在的同一行和同一列不存在其他黑色像素,那么这个黑色像素就是黑色孤独像素。
二、示例分析
- 示例 1
- 输入:
picture = [["W","W","B"],["W","B","W"],["B","W","W"]]
- 输出:
3
- 解释:全部三个
'B'
都是黑色的孤独像素。在第一行中,只有一个'B'
,且该列也只有这一个'B'
;同理第二行和第三行的'B'
也满足孤独像素的条件。
- 输入:
- 示例 2
- 输入:
picture = [["B","B","B"],["B","B","W"],["B","B","B"]]
- 输出:
0
- 解释:每一行和每一列都有多个
'B'
,不存在满足孤独像素条件的黑色像素。
- 输入:
三、解题思路
- 统计每行每列的黑色像素数量
- 定义两个数组
rowCounts
和colCounts
,分别用于记录每一行和每一列中黑色像素的数量。 - 通过两层循环遍历
picture
数组,当遇到'B'
时,相应的行和列的计数加一。
- 定义两个数组
- 统计孤独像素数量
- 再次遍历
rowCounts
数组,当某一行的黑色像素数量为1
时,说明该行可能存在孤独像素。 - 对于该行,遍历列,如果遇到
'B'
且该列的黑色像素数量也为1
,则该黑色像素为孤独像素,孤独像素数量加一。
- 再次遍历
四、代码实现
package _531;
import java.util.HashSet;
public class LeetCode531 {
public int findLonelyPixel(char[][] picture) {
int m = picture.length, n = picture[0].length;
int[] rowCounts = new int[m];
int[] colCounts = new int[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (picture[i][j] == 'B') {
rowCounts[i]++;
colCounts[j]++;
}
}
}
int lonelyCount = 0;
for (int i = 0; i < m; i++) {
if (rowCounts[i] == 1) {
for (int j = 0; j < n; j++) {
if (picture[i][j] == 'B' && colCounts[j] == 1) {
lonelyCount++;
}
}
}
}
return lonelyCount;
}
}
五、复杂度分析
- 时间复杂度:
- 第一次遍历
picture
数组统计每行每列黑色像素数量,时间复杂度为 O(m×n)O(m×n),其中 mm 是picture
的行数,nn 是picture
的列数。 - 第二次遍历
rowCounts
数组,对于每行最多遍历 nn 次列,时间复杂度为 O(m×n)O(m×n)。 - 总的时间复杂度为 O(m×n)O(m×n)。
- 第一次遍历
- 空间复杂度:
- 除了输入的
picture
数组外,额外使用了rowCounts
和colCounts
数组,它们的长度分别为 mm 和 nn 。 - 空间复杂度为 O(m+n)O(m+n)。
- 除了输入的
这种解法通过两次遍历高效地解决了问题,并且在空间使用上也比较合理,击败了 100% 的选手,是一种较为优秀的解决方案。