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?
为了尽量保证右边的点向左走,左边的点向右走,那我们就应该去这些点中间的点作为交点。
由于是曼哈顿距离,我们可以分开计算横坐标和纵坐标,结果是一样的。所以我们算出各个横坐标到中点横坐标的距离,加上各个纵坐标到中点纵坐标的距离,就是结果了。
1 public class Solution { 2 public int minTotalDistance(int[][] grid) { 3 List<Integer> xPos = new ArrayList<Integer>(); 4 List<Integer> yPos = new ArrayList<Integer>(); 5 for (int x=0; x<grid.length; x++) { 6 for (int y=0; y<grid[0].length; y++) { 7 if (grid[x][y] == 1) { 8 xPos.add(x); 9 yPos.add(y); 10 } 11 } 12 } 13 int minDis = 0; 14 for (int x : xPos) { 15 minDis += Math.abs(x - xPos.get(xPos.size()/2)); 16 } 17 Collections.sort(yPos); 18 for (int y : yPos) { 19 minDis += Math.abs(y - yPos.get(yPos.size()/2)); 20 } 21 return minDis; 22 } 23 }