题目描述(题目链接)
有一群住在不同地方的朋友(两个或以上)想要在某地见面,要求他们去往目的地的路程和最短。现在给一个0、1组成的二维数组,1表示此地有一个人居住。使用曼哈顿距离作为计算总距离,公式为:(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|
核心思想
将最小路程分解为两个问题
- 行方向上的最小距离:对于每一行,计算其他行上的朋友到这一行的距离(只计算行方向的),求最小值
- 列方向上的最小距离:对于每一列,计算其他列上的朋友到这一列的距离(只计算列方向的),求最小值
最后把两个方向的相加即为最小路径
代码
public class Solution {
/**
* @param grid: a 2D grid
* @return: the minimize travel distance
*/
public int minTotalDistance(int[][] grid) {
// Write your code here
int m = grid.length; //行数
int n = grid[0].length; //列数
int[] x = new int[m]; //记录每一行有多少个1
int[] y = new int[n]; //记录每一列有多少个1
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1){
x[i]++; //第i行包含的1的数量++
y[j]++; //第j列包含的1的数量++
}
}
}
int minx = Integer.MAX_VALUE; //每行距离的最小值
int miny = Integer.MAX_VALUE; //每列距离的最小值
for(int i=0;i<m;i++){ //对于每一行,求其他行上的1到它的总距离
int dx = 0;
for(int j=0;j<m;j++){
if(j!=i) dx+=x[j]*Math.abs(j-i); //j行1的个数*与i行的距离(也就是要走几步)
}
if(dx<minx) minx = dx; //更新最小距离
}
for(int i=0;i<n;i++){ //对于每一列,求其他列上的1到它的总距离
int dy = 0;
for(int j=0;j<n;j++){
if(j!=i) dy+=y[j]*Math.abs(j-i); //j列1的个数*与i列的距离(也就是要走几步)
}
if(dy<miny) miny = dy; //更新最小距离
}
return minx+miny; //行方向上的最小距离+列方向上的最小距离即为最小路径
}
}