zoukankan      html  css  js  c++  java
  • [LeetCode] 531. Lonely Pixel I 孤独的像素 I

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

    The picture is represented by a 2D char array consisting of 'B' and 'W', which means black and white pixels respectively.

    A black lonely pixel is character 'B' that located at a specific position where the same row and same column don't have any other black pixels.

    Example:

    Input: 
    [['W', 'W', 'B'],
     ['W', 'B', 'W'],
     ['B', 'W', 'W']]
    
    Output: 3
    Explanation: All the three 'B's are black lonely pixels. 

    Note:

    1. The range of width and height of the input 2D array is [1,500].

    给一个只含有黑白像素的图片,找出黑色孤独像素的数量。黑色孤独像素是这个像素所在的行和列都不含有黑色像素。

    最基本的想法就是找出每一个黑色像素,然后对相应的行和列进行检查,看是否含有黑色像素。但这种方法肯定含有重复操作,效率肯定不高。

    解法:利用数组rows,cols分别记录某行、某列'B'像素的个数。然后遍历一次picture找到符合条件的。

    Java:

    public int findLonelyPixel(char[][] picture) {
        int n = picture.length, m = picture[0].length;
        
        int[] rowCount = new int[n], colCount = new int[m];
        for (int i=0;i<n;i++) 
            for (int j=0;j<m;j++) 
                if (picture[i][j] == 'B') { rowCount[i]++; colCount[j]++; }
    
        int count = 0;
        for (int i=0;i<n;i++) 
            for (int j=0;j<m;j++) 
                if (picture[i][j] == 'B' && rowCount[i] == 1 && colCount[j] == 1) count++;
                    
        return count;
    }
    

    Java: DFS

    public int findLonelyPixel(char[][] picture) {
        int numLone = 0;
        for (int row = 0; row < picture.length; row++) {
            for (int col = 0; col < picture[row].length; col++) {
                if (picture[row][col] == 'W') {
                    continue;
                }
                if (dfs(picture, row - 1, col, new int[] {-1, 0}) && dfs(picture, row + 1, col, new int[] {1, 0})
                 && dfs(picture, row, col - 1, new int[] {0, -1}) && dfs(picture, row, col + 1, new int[] {0, 1})) {
                    numLone++;
                }
            }
        }
        return numLone;
    }
    
    // use dfs to find if current pixel is lonely
    private boolean dfs(char[][] picture, int row, int col, int[] increase) {
        // base case
        if (row < 0 || row >= picture.length || col < 0 || col >= picture[0].length) {
            return true;
        } else if (picture[row][col] == 'B') {
            return false;
        }
        // recursion
        return dfs(picture, row + increase[0], col + increase[1], increase);
    }    

    Python:

    # Time:  O(m * n)
    # Space: O(m + n)
    class Solution(object):
        def findLonelyPixel(self, picture):
            """
            :type picture: List[List[str]]
            :rtype: int
            """
            rows, cols = [0] * len(picture),  [0] * len(picture[0])
            for i in xrange(len(picture)):
                for j in xrange(len(picture[0])):
                    if picture[i][j] == 'B':
                        rows[i] += 1
                        cols[j] += 1
    
            result = 0
            for i in xrange(len(picture)):
                if rows[i] == 1:
                    for j in xrange(len(picture[0])):
                         result += picture[i][j] == 'B' and cols[j] == 1
            return result
    

    Python:

    class Solution(object):
        def findLonelyPixel(self, picture):
            """
            :type picture: List[List[str]]
            :type N: int
            :rtype: int
            """
            return sum(col.count('B') == 1 == picture[col.index('B')].count('B') 
                   for col in zip(*picture))

    Python:

    class Solution(object):
        def findLonelyPixel(self, picture):
            """
            :type picture: List[List[str]]
            :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
            ans = 0
            for x in range(w):
                for y in range(h):
                    if picture[x][y] == 'B':
                        if rows[x] == 1:
                            if cols[y] == 1:
                                ans += 1
            return ans  

    Python:

    class Solution(object):
      def findLonelyPixel(self, picture):
          """ :type picture: List[List[str]] :rtype: int """
          row = self.find_row(picture)
          column =self.find_colum(picture)
    
          result = 0
          for x in row:
              for y in column:
                  if picture[x][y] == "B":
                      result += 1
          return result
    
      def find_row(self, picture):
          result = []
          for x in xrange(len(picture)):
              num = 0
              for y in xrange(len(picture[x])):
                  if picture[x][y] == "B":
                      num += 1
              if num == 1:
                  result.append(x)
          return result
    
      def find_colum(self, picture):
          result = []
          for y in xrange(len(picture[0])):
              num = 0
              for x in xrange(len(picture)):
                  if picture[x][y] == "B":
                      num += 1
              if num == 1:
                  result.append(y)
          return result  
    

    C++:

    class Solution {
    public:
        int findLonelyPixel(vector<vector<char>>& picture) {
            vector<int> rows = vector<int>(picture.size());
            vector<int> cols = vector<int>(picture[0].size());
    
            for (int i = 0; i < picture.size(); ++i) {
                for (int j = 0; j < picture[0].size(); ++j) {
                    rows[i] += picture[i][j] == 'B';
                    cols[j] += picture[i][j] == 'B';
                }
            }
    
            int result = 0;
            for (int i = 0; i < picture.size(); ++i) {
                if (rows[i] == 1) {
                    for (int j = 0; j < picture[0].size() && rows[i] > 0; ++j) {
                        result += picture[i][j] == 'B' && cols[j] == 1;
                    }
                }
            }
            return result;
        }
    };
    

    C++:

    class Solution {
    public:
        int findLonelyPixel(vector<vector<char>>& picture) {
            if (picture.empty() || picture[0].empty()) return 0;
            int m = picture.size(), n = picture[0].size(), res = 0;
            vector<int> rowCnt(m, 0), colCnt(n, 0);
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (picture[i][j] == 'B') {
                        ++rowCnt[i];
                        ++colCnt[j];
                    }
                }
            }
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (picture[i][j] == 'B') {
                        if (rowCnt[i] == 1 && colCnt[j] == 1) {
                            ++res;
                        }
                    }
                }
            }
            return res;
        }
    };
    

      

      

     类似题目:

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

     

    All LeetCode Questions List 题目汇总

     

  • 相关阅读:
    LeetCode 17. Letter Combinations of a Phone Number (电话号码的字母组合)
    Mordern Effective C++ --auto
    modern effective C++ -- Deducint Types
    基于锁的并发数据结构
    C++ 内存模型
    zlib 简单封装
    assert 实现分析
    Valgrind 快速入门
    kmp算法理解与记录
    make 要点简记
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9666798.html
Copyright © 2011-2022 走看看