Best 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.

Solution

public class Solution {
    public int minTotalDistance(int[][] grid) {
        if (grid == null || grid.length == 0) return 0;

        int row = grid.length;
        int column = grid[0].length;

        List<Node> houses = new ArrayList<>();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                if (grid[i][j] == 1) {
                    houses.add(new Node(i, j));
                }
            }
        }

        int minDistance = Integer.MAX_VALUE;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                int currentDistance = 0;
                Node currentNode = new Node(i,j);
                for(Node node:houses) {
                    currentDistance += currentNode.distance(node);
                }

                minDistance = Math.min(minDistance, currentDistance);
            }
        }

        return minDistance;
    }

    private class Node {
        int x;
        int y;

        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public int distance(Node other) {
            return Math.abs(other.x - x) + Math.abs(other.y - y);
        }
    }
}

results matching ""

    No results matching ""