[LeetCode] 533. Lonely Pixel II 孤独的像素 II
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:
- Row R and column C both contain exactly N black pixels.
 - For all rows that have a black pixel at column C, they should be exactly the same as row R
 
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:
- The range of width and height of the input 2D array is [1,200].
 
531. Lonely Pixel I 的拓展,这题多了一个整数N,行和列可以最多含有N个黑元素。
解法:思路和531题一样,还是用一个行和一个列先统计黑元素的个数,然后在遍历一遍图,是黑元素并且行和列都等于N的就加到结果,最后返回结果。这题又多出一个条件2:要保证这N行的黑元素的位置要完全一样,可以一个一个的来比较。好的做法是把行元素转换成字符串或tuple,用一个哈希表记录行元素,然后直接比较行。
0[['W', 'B', 'W', 'B', 'B', 'W'], 
1 ['W', 'W', 'B', 'B', 'B', 'W'],    
2     ['W', 'B', 'W', 'B', 'B', 'W'],    
3     ['W', 'B', 'W', 'W', 'B', 'W']]
Java:
public int findBlackPixel(char[][] picture, int N) {
        int m = picture.length;
        if (m == 0) return 0;
        int n = picture[0].length;
        if (n == 0) return 0;
        Map<String, Integer> map = new HashMap<>();
        int[] colCount = new int[n];
        for (int i = 0; i < m; i++) {
            String key = scanRow(picture, i, N, colCount);
            if (key.length() != 0) {
                map.put(key, map.getOrDefault(key, 0) + 1);
            }
        }
        int result = 0;
        for (String key : map.keySet()) {
            if (map.get(key) == N) {
                for (int j = 0; j < n; j++) {
                    if (key.charAt(j) == 'B' && colCount[j] == N) {
                        result += N;
                    }
                }
            }
        }
        return result;
    }
    private String scanRow(char[][] picture, int row, int target, int[] colCount) {
        int n = picture[0].length;
        int rowCount = 0;
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < n; j++) {
            if (picture[row][j] == 'B') {
                rowCount++;
                colCount[j]++;
            }
            sb.append(picture[row][j]);
        }
        if (rowCount == target) return sb.toString();
        return "";
    }  
Java: using hashmap to store the string of rows. So that we don't need to check rule 2
public int findBlackPixel(char[][] picture, int N) {
        if (picture == null || picture.length == 0 || picture[0].length == 0) return 0;
        int m = picture.length, n = picture[0].length;
        int[] cols = new int[n];
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < m; i++) {
            int count = 0;
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < n; j++) {
                if (picture[i][j] == 'B') {
                    cols[j]++;
                    count++;
                }
                sb.append(picture[i][j]);
            }
            if (count == N) {
                String curRow = sb.toString();
                map.put(curRow, map.getOrDefault(curRow, 0) + 1);
            }
        }
        int res = 0;
        for (String row : map.keySet()) {
            if (map.get(row) != N) continue;
            for (int i = 0; i < n; i++) {
                if (row.charAt(i) == 'B' && cols[i] == N) {
                    res += N;
                }
            }
        }
        return res;
    } 
Python:
class Solution(object):
def findBlackPixel(self, picture, N):
"""
:type picture: List[List[str]]
:type N: int
:rtype: int
"""
rows, cols = [0] * len(picture), [0] * len(picture[0])
lookup = collections.defaultdict(int)
for i in xrange(len(picture)):
for j in xrange(len(picture[0])):
if picture[i][j] == 'B':
rows[i] += 1
cols[j] += 1
lookup[tuple(picture[i])] += 1 result = 0
for i in xrange(len(picture)):
if rows[i] == N and lookup[tuple(picture[i])] == N:
for j in xrange(len(picture[0])):
result += picture[i][j] == 'B' and cols[j] == N
return result
Python:
class Solution(object):
def findBlackPixel(self, picture, N):
"""
:type picture: List[List[str]]
:type N: int
:rtype: int
"""
lookup = collections.Counter(map(tuple, picture))
cols = [col.count('B') for col in zip(*picture)]
return sum(N * zip(row, cols).count(('B', N)) \
for row, cnt in lookup.iteritems() \
if cnt == N == row.count('B'))
Python:
class Solution(object):
def findBlackPixel(self, picture, N):
"""
:type picture: List[List[str]]
:type N: int
:rtype: int
"""
w, h = len(picture), len(picture[0])
rows, cols = [0] * w, [0] * h
for x in range(w):
for y in range(h):
if picture[x][y] == 'B':
rows[x] += 1
cols[y] += 1 sdict = collections.defaultdict(int)
for idx, row in enumerate(picture):
sdict[''.join(row)] += 1 ans = 0
for x in range(w):
row = ''.join(picture[x])
if sdict[row] != N:
continue
for y in range(h):
if picture[x][y] == 'B':
if rows[x] == N:
if cols[y] == N:
ans += 1
return ans
C++:
class Solution {
public:
    int findBlackPixel(vector<vector<char>>& picture, int N) {
        vector<int> rows = vector<int>(picture.size());
        vector<int> cols = vector<int>(picture[0].size());
        unordered_map<string, int> lookup;
        vector<string> srows;
        for (int i = 0; i < picture.size(); ++i) {
            string s;
            for (int j = 0; j < picture[0].size(); ++j) {
                if (picture[i][j] == 'B') {
                    ++rows[i];
                    ++cols[j];
                }
                s.push_back(picture[i][j]);
            }
            ++lookup[s];
            srows.emplace_back(move(s));
        }
        int result = 0;
        for (int i = 0; i < picture.size(); ++i) {
            if (rows[i] == N && lookup[srows[i]] == N) {
                for (int j = 0; j < picture[0].size(); ++j) {
                     result += picture[i][j] == 'B' && cols[j] == N;
                }
            }
        }
        return result;
    }
};
类似题目:
[LeetCode] 531. Lonely Pixel I 孤独的像素 I
All LeetCode Questions List 题目汇总
[LeetCode] 533. Lonely Pixel II 孤独的像素 II的更多相关文章
- [LeetCode] 531. Lonely Pixel I 孤独的像素 I
		
Given a picture consisting of black and white pixels, find the number of black lonely pixels. The pi ...
 - [LeetCode] Lonely Pixel I 孤独的像素之一
		
Given a picture consisting of black and white pixels, find the number of black lonely pixels. The pi ...
 - LeetCode 533. Lonely Pixel II (孤独的像素之二) $
		
Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...
 - [LeetCode] Lonely Pixel II 孤独的像素之二
		
Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...
 - LeetCode 531. Lonely Pixel I
		
原题链接在这里:https://leetcode.com/problems/lonely-pixel-i/ 题目: Given a picture consisting of black and wh ...
 - 533. Lonely Pixel II
		
Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...
 - LeetCode 531. Longly Pixel I (孤独的像素之一) $
		
Given a picture consisting of black and white pixels, find the number of black lonely pixels. The pi ...
 - Leetcode 137. 只出现一次的数字 II - 题解
		
Leetcode 137. 只出现一次的数字 II - 题解 137. Single Number II 在线提交: https://leetcode.com/problems/single-numb ...
 - [Leetcode 90]求含有重复数的子集 Subset II
		
[题目] Given a collection of integers that might contain duplicates, nums, return all possible subsets ...
 
随机推荐
- 洛谷 P1219 八皇后题解
			
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
 - js插件---webuploader 使用(lavarel中使用)
			
js插件---webuploader 使用(lavarel中使用) 一.总结 一句话总结: 多去看几个具体使用的实例,很多blog教程都有坑,多看几个交叉印证可以没那么多坑 1.webuploader ...
 - VMware下安装的CentOS7.5,设置成静态IP后ping不通外网
			
网上很多都说用下面的方法即可解决 在CentOS中 ping www.baidu.com 无法ping通,可能原因是DNS没配置好 方法一: 修改vim /etc/resolv.conf 增加如下内容 ...
 - SSH——ssh_exchange_identification: read: Connection reset by peer
			
前言 ssh远程连接出错 步骤 查看ssh的详细信息 [root@pre-nginx02 ~]# ssh -v 192.168.1.164 OpenSSH_6.6.1, OpenSSL 1.0.1e- ...
 - javax validation--参数基础校验
			
Bean Validation 1.1当前实现是hibernate validator 5,且spring4才支持.接下来我们从以下几个方法讲解Bean Validation 1.1,当然不一定是新特 ...
 - js 做留言提交
			
如下是留言提交源码 功能:点击按钮或点击enter键可以提交内容扩展:ctrlKey\shiftKey\altKye 可以将如上三个参数与oEvent.keyCode == 13 进行与操作可以得到 ...
 - PKUWC2019 Round 2 没去祭
			
因为今年有两场 PKUWC,所以叫 PKUWC2019 Round 2. 因为一些沙雕原因,今年去不了了. Day 0 一如既往,没有集训就去上数学课,今天讲几何变换,一如既往的只会说"少女 ...
 - 求斐波那契数列中的第N个数
			
递推 递归 1.暴力递归 2.记忆化递归 对比下二者的效率
 - Linux基础及常用指令
			
1.Linux目录结构 bin(usr/bin,user/local/bin) #存放常用指令,如cp.cat.chown等 sbin(usr/sbin,user/local/sbin) #高权限指令 ...
 - linux服务器磁盘挂载
			
1.先查看当前服务器挂载的磁盘个数 fdisk -l 2.将vdb磁盘挂载到/data目录下 mount /dev/vdb /data 3.df -h 检查磁盘挂载的情况