题目:

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:

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

链接: http://leetcode.com/problems/best-meeting-point/

题解:

很有意思的一道题目,假设二维数组中一个点到其他给定点的Manhattan Distance最小,求distance和。 因为在一维数组中这个distance最小的点就是给定所有点的median,题目又给定使用曼哈顿距离,我们就可以把二维计算分解成为两个一维的计算。应该还可以用DP的方法解决,判断用哪一种方法其实非常复杂,依赖于mn和排序的比较。我们使用一个getMin方法来计算x方向或者y方向到他们中点的距离和。

Time Complexity - Math.max(O(mn), O(nlogn)), Space Complexity - O(mn)。

public class Solution {
public int minTotalDistance(int[][] grid) {
List<Integer> xAxis = new ArrayList<>();
List<Integer> yAxis = new ArrayList<>(); for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[0].length; j++) {
if(grid[i][j] == 1) {
xAxis.add(i);
yAxis.add(j);
}
}
} return getMin(xAxis) + getMin(yAxis);
} private int getMin(List<Integer> list) {
Collections.sort(list);
int res = 0;
int lo = 0, hi = list.size() - 1;
while(lo < hi) {
res += list.get(hi--) - list.get(lo++); // hi - mid + mid - lo = hi - lo
}
return res;
}
}

二刷:

还是用了简单地先遍历一遍数组,收集行坐标和列坐标,然后对两个list分别求一维Manhattan距离的方法。这里对列坐标list进行了排序。

Java:

Time Complexity - Math.max(O(mn), O(nlogn)), Space Complexity - O(mn)。

public class Solution {
public int minTotalDistance(int[][] grid) {
List<Integer> rows = new ArrayList<>(), cols = new ArrayList<>();
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) {
rows.add(i);
cols.add(j);
}
}
}
Collections.sort(cols);
return getMinDist(rows) + getMinDist(cols);
} private int getMinDist(List<Integer> list) {
if (list == null || list.size() == 0) return Integer.MAX_VALUE;
int median = list.get(list.size() / 2);
int minDist = 0;
for (int idx : list) {
if (idx < median) minDist += median - idx;
else minDist += idx - median;
}
return minDist;
}
}

Update:

遍历两次数组,分别对行列坐标进行收集,速度反而比较快。应该是不少test case中m < logn的缘故。

Time Complexity - O(mn), O(nlogn), Space Complexity - O(mn)。

public class Solution {
public int minTotalDistance(int[][] grid) {
List<Integer> rows = new ArrayList<>(), cols = new ArrayList<>();
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) rows.add(i);
}
}
for (int j = 0; j < grid[0].length; j++) {
for (int i = 0; i < grid.length; i++) {
if (grid[i][j] == 1) cols.add(j);
}
}
return getMinDist(rows) + getMinDist(cols);
} private int getMinDist(List<Integer> list) {
if (list == null || list.size() == 0) return Integer.MAX_VALUE;
int median = list.get(list.size() / 2);
int minDist = 0;
for (int idx : list) {
if (idx < median) minDist += median - idx;
else minDist += idx - median;
}
return minDist;
}
}

Update:

不计算median,利用median - lo + hi - median = hi - lo,同时计算lo和hi到median的距离。来自大神larrywang2014的写法。

public class Solution {
public int minTotalDistance(int[][] grid) {
List<Integer> rows = new ArrayList<>(), cols = new ArrayList<>();
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) rows.add(i);
}
}
for (int j = 0; j < grid[0].length; j++) {
for (int i = 0; i < grid.length; i++) {
if (grid[i][j] == 1) cols.add(j);
}
}
return getMinDist(rows) + getMinDist(cols);
} private int getMinDist(List<Integer> list) {
if (list == null || list.size() == 0) return Integer.MAX_VALUE;
int minDist = 0;
int lo = 0, hi = list.size() - 1;
while (lo < hi) {
minDist += list.get(hi--) - list.get(lo++); // median - lo + hi - median = hi - lo
}
return minDist;
}
}

Reference:

https://leetcode.com/discuss/65336/14ms-java-solution

https://leetcode.com/discuss/65366/o-mn-java-2ms

https://leetcode.com/discuss/65464/java-python-40ms-pointers-solution-median-sort-explanation

https://leetcode.com/discuss/66401/the-only-person-dont-know-median-could-give-shortest-distance

http://math.stackexchange.com/questions/113270/the-median-minimizes-the-sum-of-absolute-deviations

https://leetcode.com/discuss/65510/simple-java-code-without-sorting

http://www.jiuzhang.com/problem/30/

296. Best Meeting Point的更多相关文章

  1. [LeetCode] 296. Best Meeting Point 最佳开会地点

    A group of two or more people wants to meet and minimize the total travel distance. You are given a ...

  2. 【leetcode】296.Best Meeting Point

    原题 A group of two or more people wants to meet and minimize the total travel distance. You are given ...

  3. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  4. LeetCode题目按公司分类

    LinkedIn(39) 1 Two Sum 23.0% Easy 21 Merge Two Sorted Lists 35.4% Easy 23 Merge k Sorted Lists 23.3% ...

  5. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  6. Leetcode重点 250题-前400 题

    删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于简单题目(例:100题:Same Tree) 删除题意不同,代码基本相同题目(例:136 & ...

  7. LeetCode分类-前400题

    1. Array 基础 27 Remove Element 26 Remove Duplicates from Sorted Array 80 Remove Duplicates from Sorte ...

  8. Hard模式题目

    先过一下Hard模式的题目吧.   # Title Editorial Acceptance Difficulty Frequency   . 65 Valid Number     12.6% Ha ...

  9. 继续过Hard题目

    接上一篇:http://www.cnblogs.com/charlesblc/p/6283064.html 继续过Hard模式的题目吧.   # Title Editorial Acceptance ...

随机推荐

  1. 从浅到深掌握Oracle的锁

      1.分别模拟insert,update和delete造成阻塞的示例,并对v$lock中的相应的信息进行说明,给 出SQL演示. Insert示例 会话:SQL> select * from ...

  2. PSP0级 周活动总结表+时间记录日志+缺陷记录日志 表格模板

    一.项目计划总结: 周活动总结表 姓名:               日期: 日期\任务 听课 编写程序 阅读课本 准备考试     日总计 周日               周一           ...

  3. Careercup - Microsoft面试题 - 5204967652589568

    2014-05-11 23:57 题目链接 原题: identical balls. one ball measurements ........ dead easy. 题目:9个看起来一样的球,其中 ...

  4. Shell采集系统cpu 内存 磁盘 网络信息

    cpu信息采集 cpu使用率 采集算法 通过/proc/stat文件采集并计算CPU总使用率或者单个核使用率.以cpu0为例,算法如下: 1. cat /proc/stat | grep ‘cpu0’ ...

  5. 【Merge K Sorted Lists】cpp

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

  6. selenium--上传图片

    html 源码: 上传图片 <input type="file" name="PicFile" style="width: 180px;&quo ...

  7. boost环境搭建

    切换到boost目录下面,使用编译命令>bjam.exe --with-date_time --toolset=msvc-9.0 --build-type=complete stage --wi ...

  8. matrix_world_final_2011

    C  http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98613#problem/C 题意:输入16进制的n*m矩阵,其在二进制表示下有6种 ...

  9. javascript去除首尾空白字符

    if ( twocode.replace(/^\s+|\s+$/g,"")=="" ) { alert("二维码不能为空"); docume ...

  10. vitrualbox虚拟机64位安装报错解决

    1 NtCreateFile(\Device\VBoxDrvStub) failed: 0xc0000034 STATUS_OBJECT_NAME_NOT_FOUND (0 retries) 解决办法 ...