Problem Link

Description


You are given a positive integer n, representing an n x n city. You are also given a 2D grid buildings, where buildings[i] = [x, y] denotes a unique building located at coordinates [x, y].

A building is covered if there is at least one building in all four directions: left, right, above, and below.

Return the number of covered buildings.

Β 

Example 1:

Input: n = 3, buildings = [[1,2],[2,2],[3,2],[2,1],[2,3]]

Output: 1

Explanation:

  • Only building [2,2] is covered as it has at least one building:
    <ul>
    	<li>above (<code>[1,2]</code>)</li>
    	<li>below (<code>[3,2]</code>)</li>
    	<li>left (<code>[2,1]</code>)</li>
    	<li>right (<code>[2,3]</code>)</li>
    </ul>
    </li>
    <li>Thus, the count of covered buildings is 1.</li>
    

Example 2:

Input: n = 3, buildings = [[1,1],[1,2],[2,1],[2,2]]

Output: 0

Explanation:

  • No building has at least one building in all four directions.

Example 3:

Input: n = 5, buildings = [[1,3],[3,2],[3,3],[3,5],[5,3]]

Output: 1

Explanation:

  • Only building [3,3] is covered as it has at least one building:
    <ul>
    	<li>above (<code>[1,3]</code>)</li>
    	<li>below (<code>[5,3]</code>)</li>
    	<li>left (<code>[3,2]</code>)</li>
    	<li>right (<code>[3,5]</code>)</li>
    </ul>
    </li>
    <li>Thus, the count of covered buildings is 1.</li>
    

Β 

Constraints:

  • 2 <= n <= 105
  • 1 <= buildings.length <= 105
  • buildings[i] = [x, y]
  • 1 <= x, y <= n
  • All coordinates of buildings are unique.

Solution


Python3

class Solution:
    def countCoveredBuildings(self, n: int, buildings: List[List[int]]) -> int:
        rows, cols = len(buildings), len(buildings[0])
        R = defaultdict(list)
        C = defaultdict(list)
        res = 0
 
        for x, y in buildings:
            R[x].append(y)
            C[y].append(x)
 
        for k in R.keys():
            R[k].sort()
 
        for k in C.keys():
            C[k].sort()
 
        for x, y in buildings:
            rIndex = bisect_left(R[x], y)
            cIndex = bisect_left(C[y], x)
 
            if 0 < rIndex < len(R[x]) - 1 and 0 < cIndex < len(C[y]) - 1:
                res += 1
 
        return res