Problem Description:
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?
This problem can be solved in each dimension and combine them together. And it can be proved that the median is the smallest point. Actually, the points between two medians in even length of numbers are the same value. So, for the simple case, we can just use the less one when it's even length.
int minTotalDistance(vector<vector<int>>& grid) {
vector<int> x, y;
int rowlen=grid.size();
if(!rowlen) return 0;
int collen = grid[0].size();
if(!collen) return 0;
for(int i=0;i<rowlen;i++)
{
for(int j=0;j<collen;j++)
{
if(grid[i][j])
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>x.push_back(i);
<span style="white-space:pre"> </span>y.push_back(j);
<span style="white-space:pre"> </span>}
}
}
int xm=x[x.size()/2];
int ym=y[y.size()/2];
int s=0;
for(int i=0;i<x.size();i++)
{
s+=abs(x[i]-xm);
}
for(int i=0;i<x.size();i++)
{
s+=abs(y[i]-ym);
}
return s;
}