Meeting Point

题目描述

A group of two or more people wants to meet and minimize the total travel distance. You are given a 2D grid of values 0 or 1, where each 1 marks the home of someone in the group. The distance is calculated using Manhattan Distance, where distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|.

For example, given three people living at (0,0), (0,4), and (2,2):

1 - 0 - 0 - 0 - 1
|   |   |   |   |
0 - 0 - 0 - 0 - 0
|   |   |   |   |
0 - 0 - 1 - 0 - 0

The point (0,2) is an ideal meeting point, as the total travel distance of 2+2+2=6 is minimal. So return 6.

Hint:

Try to solve it in one dimension first. How can this solution apply to the two dimension case?

follow up:

There can be multiple people in the same room.

解题方法

这一题距离的计算方法其实是x于y分开的,所以我们可以把它分为2个1-D的结果的和。

在X轴的1-D问题上,最佳的meeting point就是所有X坐标的median中间点

  • 如果是偶数个,只要是中间两个点之间就可以
  • 如果是奇数个,那就应该是中间那个点

Solution

class Solution(object):
    def minTotalDistance(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        if not grid:
            return 0

        row = len(grid)
        col = len(grid[0])

        rowArr = []
        colArr = []

        for i in range(row):
            for j in range(col):
                if grid[i][j] == 1:
                   rowArr.append(i)
                   colArr.append(j)
        colArr.sort()

        result = 0
        medianRow = rowArr[len(rowArr)/2]
        medianCol = colArr[len(colArr)/2]

        for r in rowArr:
            result += abs(r-medianRow)
        for c in colArr:
            result += abs(c-medianCol)

        return result

Reference