博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Best Meeting Point 解答
阅读量:5211 次
发布时间:2019-06-14

本文共 3619 字,大约阅读时间需要 12 分钟。

Question

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 , 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:

  1. Try to solve it in one dimension first. How can this solution apply to the two dimension case?

Solution 1 -- Sort

根据曼哈顿距离的表达式,我们可以把这个问题转化为求每一维的最短距离。

总距离 = x上最短总距离 + y上最短总距离

并且,我们观察到,对于一个序列,如 [0,0,1,0,1,0,1,1,1,0,0,1]

当邮局选在median的位置时,距离和是最小的。

因此,这里我们遍历数组,得到home的x和y坐标值,然后分别对这两个list排序。再用双指针得到总的最短距离和。

Time complexity O(mn log(mn))

1 public class Solution { 2     public int minTotalDistance(int[][] grid) { 3         if (grid == null || grid.length < 1) { 4             return 0; 5         } 6         int m = grid.length, n = grid[0].length; 7         List
xList = new ArrayList
(); 8 List
yList = new ArrayList
(); 9 for (int i = 0; i < m; i++) {10 for (int j = 0; j < n; j++) {11 if (grid[i][j] == 1) {12 xList.add(i);13 yList.add(j);14 }15 }16 }17 return calcTotalDistance(xList) + calcTotalDistance(yList);18 }19 20 private int calcTotalDistance(List
list) {21 if (list == null || list.size() < 2) {22 return 0;23 }24 Collections.sort(list);25 int len = list.size();26 int i = 0, j = len - 1;27 int result = 0;28 while (i < j) {29 int left = list.get(i);30 int right = list.get(j);31 result += (right - left);32 i++;33 j--;34 }35 return result;36 }37 }

Solution 2 -- Without sorting

Discussion里有人给出了不用排序的方法。时间复杂度降低为O(mn)

因为双层循环遍历数组本身就是有次序性的。

1. 外层循环为遍历行,内层循环为遍历该行的每一个元素。

这样得到的是排序好的x的list

2. 外层循环为遍历列,内层循环为遍历该列的每一个元素。

这样得到的是排序好的y的list

1 public class Solution { 2     public int minTotalDistance(int[][] grid) { 3         if (grid == null || grid.length < 1) { 4             return 0; 5         } 6         int m = grid.length, n = grid[0].length; 7         List
xList = new ArrayList
(); 8 List
yList = new ArrayList
(); 9 for (int i = 0; i < m; i++) {10 for (int j = 0; j < n; j++) {11 if (grid[i][j] == 1) {12 xList.add(i);13 }14 }15 }16 for (int j = 0; j < n; j++) {17 for (int i = 0; i < m; i++) {18 if (grid[i][j] == 1) {19 yList.add(j);20 }21 }22 }23 24 return calcTotalDistance(xList) + calcTotalDistance(yList);25 }26 27 private int calcTotalDistance(List
list) {28 if (list == null || list.size() < 2) {29 return 0;30 }31 int len = list.size();32 int i = 0, j = len - 1;33 int result = 0;34 while (i < j) {35 result += (list.get(j--) - list.get(i++));36 }37 return result;38 }39 }

 

转载于:https://www.cnblogs.com/ireneyanglan/p/4945004.html

你可能感兴趣的文章
android permission
查看>>
javascript获取textarea中所选文本的开始位置、结束位置和选择的文本
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>
JSch - Java实现的SFTP(文件上传详解篇)
查看>>
一些注意点
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
C#修饰符
查看>>
20.核心初始化之异常向量表
查看>>
[BSGS][哈希]luogu P3846 可爱的质数
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
iostat参数说明
查看>>
js 封装获取元素的第一个元素
查看>>
iOS 获取Home键指纹验证
查看>>
Python-Mac 安装 PyQt4
查看>>
P2571 [SCOI2010]传送带
查看>>
哈希表1
查看>>
用Data Url (data:image/jpg;base64,)将小图片生成数据流形式
查看>>
实验2-2
查看>>
C#初识
查看>>