1637. Wildest Vertical Area Between Two Points Containing No Points - Explanation

Problem Link



Prerequisites

Before attempting this problem, you should be comfortable with:

  • Sorting - Sorting points by x-coordinate allows finding the maximum gap between consecutive points efficiently
  • Array Iteration - Scanning through sorted points to compute differences between adjacent x-coordinates

1. Brute Force

Intuition

The most straightforward approach is to check every pair of points and determine if the vertical area between them contains any other points. For each pair, we compute the horizontal distance and verify that no other point lies strictly between them in the x-coordinate. This gives us the correct answer but is inefficient for large inputs.

Algorithm

  1. Iterate through all pairs of points using two nested loops.
  2. For each pair of points with x-coordinates x1 and x2, check if any other point has an x-coordinate strictly between min(x1, x2) and max(x1, x2).
  3. If no point exists between them, calculate the width as the absolute difference of their x-coordinates.
  4. Track and return the maximum width found among all valid pairs.
class Solution:
    def maxWidthOfVerticalArea(self, points: List[List[int]]) -> int:
        n = len(points)
        res = 0

        for i in range(1, n):
            x1 = points[i][0]
            for j in range(i):
                x2 = points[j][0]
                hasPoints = False
                for k in range(n):
                    if k == i or k == j:
                        continue

                    x3 = points[k][0]
                    if x3 > min(x1, x2) and x3 < max(x1, x2):
                        hasPoints = True
                        break

                if not hasPoints:
                    res = max(res, abs(x1 - x2))

        return res

Time & Space Complexity

  • Time complexity: O(n3)O(n ^ 3)
  • Space complexity: O(1)O(1)

2. Sorting

Intuition

The key insight is that a vertical area containing no points must exist between two consecutive points when sorted by x-coordinate. If we sort all points by their x-values, the widest gap between adjacent points gives us the answer directly. This works because any non-adjacent pair would have at least one point between them, making that area invalid.

Algorithm

  1. Sort the points array by x-coordinate.
  2. Iterate through consecutive pairs of sorted points.
  3. For each consecutive pair, calculate the difference in their x-coordinates.
  4. Return the maximum difference found.
class Solution:
    def maxWidthOfVerticalArea(self, points: List[List[int]]) -> int:
        points.sort()
        res = 0
        for i in range(len(points) - 1):
            res = max(res, points[i + 1][0] - points[i][0])
        return res

Time & Space Complexity

  • Time complexity: O(nlogn)O(n \log n)
  • Space complexity: O(1)O(1) or O(n)O(n) depending on the sorting algorithm.

Common Pitfalls

Using Y-Coordinates Instead of X-Coordinates

The problem asks for the widest vertical area, which means we need to find gaps along the x-axis. A common mistake is to consider y-coordinates or try to compute 2D distances between points.

# Wrong: using y-coordinate
width = abs(points[i][1] - points[j][1])

# Correct: using x-coordinate only
width = abs(points[i][0] - points[j][0])

Checking Non-Adjacent Points After Sorting

After sorting by x-coordinate, the maximum gap must occur between consecutive points. Some attempt to check all pairs even after sorting, which is unnecessary and leads to O(n^2) complexity.

# Wrong: checking all pairs after sorting
for i in range(n):
    for j in range(i + 1, n):
        res = max(res, points[j][0] - points[i][0])

# Correct: only check adjacent pairs
for i in range(n - 1):
    res = max(res, points[i + 1][0] - points[i][0])

Forgetting to Sort by X-Coordinate Only

When sorting 2D points, the default sort may use both x and y coordinates for tie-breaking. While this still works, some mistakenly sort by y-coordinate or use a complex comparator when only x matters.

# Correct: sort by x-coordinate (y doesn't affect the answer)
points.sort(key=lambda p: p[0])