问题描述

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:

  1. Row R and column C both contain exactly N black pixels.
  2. 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].

算法分析

先遍历一次二维表,统计各行各列 'B' pixel 的个数。 然后构造一个HashMap<String,Integer),对于那些 'B' 的个数有 N 个的行,将该行的 'WB' 序列当做一个字符串,统计这样的序列有多少。最后再对那些 'B' 的个数有 N 个的行,如果 HashMap 中该行的字符序列有 N 个,那么遍历该行所有的 'B' 所在的列,如果这一列有 N 个 'B',那么这一列的 N 个 'B' 就都是符合要求的 pixel了。 为了快速找到一行中的 'B' 所在的列,构造一个二维数组 int[][] rowIndexex=new int[rows][N],rowIndexes[i][j] 用于记录第 i 行第 j 个 'B' 所在的列数。

Java 算法实现:

public class Solution {
public int findBlackPixel(char[][] picture, int N) {
int rows=picture.length;
int cols=picture[0].length;
int []row=new int[rows];
int []col=new int[cols];
int [][]rowIndexes=new int[rows][N];//rowIndexes[i][j] 用于记录第 i 行第 j 个 'B' 所在的列数。
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(picture[i][j]=='B'){
if(row[i]!=-1&&row[i]!=N){
rowIndexes[i][row[i]]=j;//当前考察的'B'是第i行的第row[i]个'B'(从0开始计数),其所在列为 j 。
row[i]++;
}
else if(row[i]==N){// 第i行中的'B'的个数超过了N个,就将row[i]置为-1,以后就不用考虑该行了
row[i]=-1;
}
col[j]++;
}
}
}
Map<String, Integer>map=new HashMap<>();
for(int i=0;i<rows;i++){
String str=new String(picture[i]);//将这一行的'WB'序列当做一个字符串
if(map.containsKey(str)){//统计这中序列的个数,便于后面快速判断这一行是否符合要求(即有N个行的序列是这个序列)
int value=map.get(str)+1;
map.put(str, value);
}
else{
map.put(str, 1);
}
} int ans=0; for(int i=0;i<rows;i++){
if(row[i]==N){
String key=new String(picture[i]);
if(map.get(key)==N){//对于那些row[i]==N的行,其序列数目也为N,那么这一行上的'B'可能符合要求,下面进一步判断
for(int j=0;j<N;j++){
int jCol=rowIndexes[i][j];//jCol为第i行的'B'所在的列
if(col[jCol]==N){//这一列符合要求,那么这一列的N个'B'就都符合要求
ans+=N;
col[jCol]=-2;//后面跟这一列关联的行就不需要再进行重复计算了
}
else if(col[jCol]==-2){//说明与该行关联的含'B'的列之前已经在前面的行中进行统计过了,那么这一行就不必再统计了,直接退出本行的统计就可以了,提高算法时间效率
break;
}
}
}
}
}
return ans;
}
}

LeetCode 533----Lonely Pixel II的更多相关文章

  1. [LeetCode] 533. Lonely Pixel II 孤独的像素 II

    Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...

  2. LeetCode 533. Lonely Pixel II (孤独的像素之二) $

    Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...

  3. 533. Lonely Pixel II

    Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...

  4. [LeetCode] 531. Lonely Pixel I 孤独的像素 I

    Given a picture consisting of black and white pixels, find the number of black lonely pixels. The pi ...

  5. [LeetCode] Lonely Pixel II 孤独的像素之二

    Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...

  6. LeetCode 531. Lonely Pixel I

    原题链接在这里:https://leetcode.com/problems/lonely-pixel-i/ 题目: Given a picture consisting of black and wh ...

  7. [LeetCode] Lonely Pixel I 孤独的像素之一

    Given a picture consisting of black and white pixels, find the number of black lonely pixels. The pi ...

  8. LeetCode 531. Longly Pixel I (孤独的像素之一) $

    Given a picture consisting of black and white pixels, find the number of black lonely pixels. The pi ...

  9. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  10. [array] leetcode - 40. Combination Sum II - Medium

    leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...

随机推荐

  1. SuperMap(无对应字段)空间属性挂接

    一.数据准备 将一个没有基本属性的模型数据集和一个含有位置等属性信息的shp属性表进行挂接,两组数据之间没有连接字段,但同属一个坐标系下,只能通过空间位置信息进行属性挂接. 二.数据处理 基本思路:将 ...

  2. 【笔记】AJAX+SweetAlert插件实现删除操作

    [笔记]AJAX+SweetAlert插件实现删除操作 Django AJAX SweetAlert  展示 SweetAlert 插件介绍 SweetAlert 是一个 JS 插件,能够完美替代 J ...

  3. FJWC2019 全连

    题目描述 有n个音符,第i个音符会在第i个时刻来临 令第 i 个音符的准备时间为 ti​ 个单位时间,如果选择去点击第 i 个音符,那么就没法点击所有到来时刻在 (i−ti​ ,i+ti​)中的音符. ...

  4. e的理解

    1. e是一个重要的常数,但是我一直不知道,它的真正含义是什么. 它不像π.大家都知道,π代表了圆的周长与直径之比3.14159,可是如果我问你,e代表了什么.你能回答吗? 维基百科说: " ...

  5. 【Maven学习】maven-assembly-plugin的使用

    转自http://liugang594.iteye.com/blog/2093607 maven-assembly-plugin使用描述(拷自 maven-assembly-plugin 主页) Th ...

  6. Go语言学习笔记四: 运算符

    Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...

  7. CodeForces 1060 B Maximum Sum of Digits

    Maximum Sum of Digits You are given a positive integer n. Let S(x)S(x) be sum of digits in base 10 r ...

  8. Mathematik

    Ausdruck auf Deutsch Lösen Problem der Abteilung. 求导. Die Abteilung von 3x ist 3. 3x的导数是3 Lösen Prob ...

  9. ViewPager(视图滑动切换工具)

    <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.Cons ...

  10. Python 逐行分割大txt文件

    # -*- coding: <encoding name> -*- import io LIMIT = 150000 file_count = 0 url_list = [] with i ...