每日一题--912 最佳见面地点

题目描述(题目链接

有一群住在不同地方的朋友(两个或以上)想要在某地见面,要求他们去往目的地的路程和最短。现在给一个0、1组成的二维数组,1表示此地有一个人居住。使用曼哈顿距离作为计算总距离,公式为:(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|

核心思想

将最小路程分解为两个问题

  1. 行方向上的最小距离:对于每一行,计算其他行上的朋友到这一行的距离(只计算行方向的),求最小值
  2. 列方向上的最小距离:对于每一列,计算其他列上的朋友到这一列的距离(只计算列方向的),求最小值

最后把两个方向的相加即为最小路径

代码

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; //行方向上的最小距离+列方向上的最小距离即为最小路径
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值