Maximum Manhattan Distance of Two Points in Points Set

Manhattan Distance


Definition: The Manhattan distance between two points $(x_1, y_1)$ and $(x_2, y_2)$ in a 2D plane is defined as $dis = |x_1 - x_2| + |y_1 - y_2|$, where $| \cdot |$ denotes the absolute value.

Problem Definition


Given a set of points ${p_1, p_2, \ldots, p_n}$, where each point $p_i$ is represented by its coordinates $(x_i, y_i)$ in a 2D plane, the task is to find the maximum Manhattan distance between any two points $p_a$ and $p_b$ in the set. The desired time complexity for the solution is $O(n)$.

Solution


To avoid the absolute value operation in the definition of Manhattan distance, we can consider different cases based on the relative positions of the points:

  • Case 1: $dis_1 = x_1 - x_2 + y_1 - y_2$, when $x_1 > x_2$ and $y_1 > y_2$
  • Case 2: $dis_2 = x_2 - x_1 + y_1 - y_2$, when $x_1 < x_2$ and $y_1 > y_2$
  • Case 3: $dis_3 = x_1 - x_2 + y_2 - y_1$, when $x_1 > x_2$ and $y_1 < y_2$
  • Case 4: $dis_4 = x_2 - x_1 + y_2 - y_1$, when $x_1 < x_2$ and $y_1 < y_2$

By simplifying these expressions, we can rewrite them as:

  • Simplified Case 1: $dis_1 = (x_1 + y_1) - (x_2 + y_2)$
  • Simplified Case 2: $dis_2 = -(x_1 - y_1) - (x_2 - y_2)$
  • Simplified Case 3: $dis_3 = (x_1 - y_1) - (x_2 - y_2)$
  • Simplified Case 4: $dis_4 = -(x_1 + y_1) + (x_2 + y_2)$

From these simplified cases, we can deduce that the maximum Manhattan distance can be obtained by considering the following scenarios:

  • The maximum value of $(x+y)$ minus the minimum value of $(x+y)$
  • The minimum value of $(x-y)$ minus the minimum value of $(x-y)$
  • The maximum value of $(x-y)$ minus the minimum value of $(x-y)$
  • The minimum value of $(x+y)$ minus the maximum value of $(x+y)$

By iterating through the set of points and calculating these values, we can find the maximum Manhattan distance in $O(n)$ time complexity.

Here is Python code.

class Solution:
    def maxPoints(self, points):
        max_plus = max_minus = max_diff_plus = max_diff_minus = float('-inf')
        min_plus = min_minus = min_diff_plus = min_diff_minus = float('inf')
        max_plus_point = max_minus_point = max_diff_plus_point = max_diff_minus_point = None
        min_plus_point = min_minus_point = min_diff_plus_point = min_diff_minus_point = None

        for point in points:
            x, y = point
            if x + y > max_plus:
                max_plus = x + y
                max_plus_point = point
            if x + y < min_plus:
                min_plus = x + y
                min_plus_point = point
            if x - y > max_minus:
                max_minus = x - y
                max_minus_point = point
            if x - y < min_minus:
                min_minus = x - y
                min_minus_point = point
            if -x + y > max_diff_plus:
                max_diff_plus = -x + y
                max_diff_plus_point = point
            if -x + y < min_diff_plus:
                min_diff_plus = -x + y
                min_diff_plus_point = point
            if -x - y > max_diff_minus:
                max_diff_minus = -x - y
                max_diff_minus_point = point
            if -x - y < min_diff_minus:
                min_diff_minus = -x - y
                min_diff_minus_point = point

        distances = {
            (max_plus - min_plus): (max_plus_point, min_plus_point),
            (max_minus - min_minus): (max_minus_point, min_minus_point),
            (max_diff_plus - min_diff_plus): (max_diff_plus_point, min_diff_plus_point),
            (max_diff_minus - min_diff_minus): (max_diff_minus_point, min_diff_minus_point)
        }

        max_distance = max(distances.keys())
        return distances[max_distance], max_distance