lintcode 574 · 邮局的建立 【中等 vip 枚举法】

题目

https://www.lintcode.com/problem/574/description

给出一个二维的网格,每一个格子上用 1 表示房子,0 表示空。要求在网格中,找到一个空地建立邮局,使得邮局到所有的房子的距离和最小。返回所有房子到邮局的最小距离和,如果不可能建邮局则返回-1。


你可以穿越房子和空地
你只能在空地建立邮局。
房子跟邮局之间的距离为曼哈顿距离
样例
样例 1:

输入:[[0,1,0,0],[1,0,1,1],[0,1,0,0]]
输出: 6
解释:
把邮局设立在(1,1)这个位置时,邮局离所有的房子的距离和是最近的
样例 2:

输入:[[0,1,0],[1,0,1],[0,1,0]]
输出:4
解释:
把邮局设立在(1,1)这个位置时,邮局离所有的房子的距离是最近的。

思路

直接用暴力法即可。先算一下每一行和每一列有多少个房子,
然后将曼哈顿距离分成两个方向分别统计距离和。

直接枚举每个空地,算一下曼哈顿距离和即可。代码如下:

java代码

public class Solution {
    /**
     * @param grid: a 2D grid
     * @return: An integer
     */
    public int shortestDistance(int[][] grid) {
         //直接用暴力法即可。先算一下每一行和每一列有多少个房子,
        // 然后将曼哈顿距离分成两个方向分别统计距离和。
        // 直接枚举每个空地,算一下曼哈顿距离和即可。代码如下:
        int n = grid.length, m = grid[0].length;
        //计算一下有多个房子,没列有多少个房子
        int[] row = new int[n];
        int[] col = new int[m];

        for (int i = 0; i <n ; i++) {
            for (int j = 0; j <m ; j++) {
                if(grid[i][j] ==1){
                    row[i]++;
                    col[j]++;
                }
            }
        }

//        for (int i = 0; i 
//            System.out.print(i+"行:"+row[i]+" ");
//        }
//
//        System.out.println();
//        for (int i = 0; i 
//            System.out.print(i+"列:"+col[i]+" ");
//        }

        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <m ; j++) {
                if(grid[i][j] ==1)  continue;
                //枚举空地

                int dis =0;
                //累加x方向上的距离和
                for (int k = 0; k <n ; k++) {
                    dis+=row[k]*Math.abs(k-i);
                    if(ans <= dis)
                        break;
                }

                //累加y方向的距离和
                for (int k = 0; k < m; k++) {
                    dis+= col[k]*Math.abs(k-j);
                    if(ans<=dis)
                        break;
                }
                ans =Math.min(ans,dis);
            }
        }

        return ans;
    }
}

你可能感兴趣的:(算法)