C++中的孤独像素 II
假设我们有一张由黑白像素组成的图片,我们需要找到在第 R 行和第 C 列中存在的黑色像素的数量。该数量必须符合以下所有规则:
R 和 C 将恰好包含 N 个黑色像素。
对于所有在第 C 列具有黑色像素的行,它们都应该与第 R 行完全相同。
这里图片由一个二维字符数组表示,其中 'B' 和 'W' 分别代表黑色和白色像素。
如果输入如下:
W | B | W | B | B | W |
W | B | W | B | B | W |
W | B | W | B | B | W |
W | W | B | W | B | W |
并且 N = 3,则输出将为 6。因为所有加粗的 'B' 都是黑色像素,所有位于第 1 列和第 3 列的 'B'。现在,如果我们取第 R = 0 行和第 C = 1 列的 'B' 作为示例:规则 1,第 R = 0 行和第 C = 1 列都恰好有 N 个 'B' 像素。并且规则 2,在第 C = 1 列具有 'B' 像素的行是第 0 行、第 1 行和第 2 行。它们与第 R = 0 行完全相同。
为了解决这个问题,我们将遵循以下步骤:
ret := 0
定义一个映射 r 和另一个映射 c
n := p 的行数,m := p 的列数
初始化 i := 0,当 i < n 时,更新(i 加 1),执行:
初始化 j := 0,当 j < m 时,更新(j 加 1),执行:
如果 p[i, j] 等于 'B',则:
将 j 插入到 r[i] 中
将 i 插入到 c[j] 中
初始化 i := 0,当 i < n 时,更新(i 加 1),执行:
初始化 j := 0,当 j < m 且 i 在 r 中时,更新(j 加 1),执行:
如果 p[i, j] 等于 'B' 且 r[i] 的大小等于 N 且 c[j] 的大小等于 N,则:
ok := true
对于 c[j] 中的每个 x,执行
如果 r[x] 不等于 r[i],则:
ok := false
退出循环
ret := ret + ok
返回 ret
示例(C++)
让我们看看以下实现以更好地理解:
#include <bits/stdc++.h> using namespace std; class Solution { public: int findBlackPixel(vector<vector<char>>& p, int N) { int ret = 0; unordered_map <int, set <int> > r, c; int n = p.size(); int m = p[0].size(); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(p[i][j] == 'B'){ r[i].insert(j); c[j].insert(i); } } } for(int i = 0; i < n; i++){ for(int j = 0; j < m && r.count(i); j++){ if(p[i][j] == 'B' && r[i].size() == N && c[j].size() == N){ bool ok = true; for(auto& x : c[j]){ if(r[x] != r[i]){ ok = false; break; } } ret += ok; } } } return ret; } }; main(){ Solution ob; vector<vector<char>> v = {{'W','B','W','B','B','W'},{'W','B','W','B','B','W'},{'W','B','W','B' ,'B','W'},{'W','W','B','W','B','W'}}; cout << (ob.findBlackPixel(v, 3)); }
输入
{{'W','B','W','B','B','W'},{'W','B','W','B','B','W'},{'W','B','W','B' ,'B','W'},{'W','W','B','W','B','W'}}, 3
输出
6