题目:
Given a picture consisting of black and white pixels, and a positive integer N, find the number of black pixels located at some specific row R and column C that align with all the following rules:
The picture is represented by a 2D char array consisting of 'B' and 'W', which means black and white pixels respectively.
Example:
Input: [['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 Output: 6 Explanation: All the bold 'B' are the black pixels we need (all 'B's at column 1 and 3). 0 1 2 3 4 5 column index 0 [['W', 'B', 'W', 'B', 'B', 'W'], 1 ['W', 'B', 'W', 'B', 'B', 'W'], 2 ['W', 'B', 'W', 'B', 'B', 'W'], 3 ['W', 'W', 'B', 'W', 'B', 'W']] row index Take 'B' at row R = 0 and column C = 1 as an example: Rule 1, row R = 0 and column C = 1 both have exactly N = 3 black pixels. Rule 2, the rows have black pixel at column C = 1 are row 0, row 1 and row 2. They are exactly the same as row R = 0.
Note:
思路:
和上一道题目类似,只不过加了一个额外条件,就是在某个位置上的黑点如果要符合条件,在该列上为黑点的所有行中的内容还需要相等。为此我们定义了一个哈希表和一个string构成的行向量,这是因为将vector
代码:
class Solution {
public:
int findBlackPixel(vector>& picture, int N) {
if (picture.size() == 0 || picture[0].size() == 0) {
return 0;
}
vector row_pixels(picture.size(), 0);
vector col_pixels(picture[0].size(), 0);
unordered_map same_rows; // map the row string to appearance count
vector rows; // convert the vector to string for easier comparison
for (int r = 0; r < picture.size(); ++r) {
string s;
for (int c = 0; c < picture[r].size(); ++c) {
if (picture[r][c] == 'B') {
++row_pixels[r], ++col_pixels[c];
}
s.push_back(picture[r][c]);
}
++same_rows[s];
rows.push_back(s);
}
int ret = 0;
for (int r = 0; r < picture.size(); ++r) {
if (row_pixels[r] == N && same_rows[rows[r]] == N) {
for (int c = 0; c < picture[r].size(); ++c) {
if (picture[r][c] == 'B' && col_pixels[c] == N) {
++ret;
}
}
}
}
return ret;
}
};