296. 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.
Hint:
- 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的更多相关文章
- [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 ...
- 【leetcode】296.Best Meeting Point
原题 A group of two or more people wants to meet and minimize the total travel distance. You are given ...
- LeetCode All in One 题目讲解汇总(持续更新中...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...
- LeetCode题目按公司分类
LinkedIn(39) 1 Two Sum 23.0% Easy 21 Merge Two Sorted Lists 35.4% Easy 23 Merge k Sorted Lists 23.3% ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- Leetcode重点 250题-前400 题
删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于简单题目(例:100题:Same Tree) 删除题意不同,代码基本相同题目(例:136 & ...
- LeetCode分类-前400题
1. Array 基础 27 Remove Element 26 Remove Duplicates from Sorted Array 80 Remove Duplicates from Sorte ...
- Hard模式题目
先过一下Hard模式的题目吧. # Title Editorial Acceptance Difficulty Frequency . 65 Valid Number 12.6% Ha ...
- 继续过Hard题目
接上一篇:http://www.cnblogs.com/charlesblc/p/6283064.html 继续过Hard模式的题目吧. # Title Editorial Acceptance ...
随机推荐
- 轻松解决在一个虚拟主机上运行多个 ASP.NET 网站应用
不知道有没有朋友像我一样会遇到这样一个问题: 在网上购买 .NET 空间,由于虚拟主机的限制,你并不能把某个目录设为一个独立的应用,或者一些价格比较高的空间,虽然可以设置,但数量也是有限的.这个问题导 ...
- Crawling is going on - Alpha版本测试报告
[Crawling is going on - Alpha版本] 测 试 报 告 文件状态: [] 草稿 [√] 正式发布 [] 正在修改 报告编号: 当前版本: 1.0.2 编写人: 周萱.林谋武. ...
- 小组开发项目针对性的NABC分析
单独就我们团队开发项目——重力解锁的功能特点而言,我们解决了智能手机屏幕解锁的乏味和繁琐的特点,显得更有趣味性和独特性,更符合现代人追随时尚的潮流:我们根据个人的不同喜好和便利性来设定一些动作,利用重 ...
- maven安装报错
今天在安装maven时安照说明配置环境变量,通过命令检查: mvn -v 竟然出现以下错误,很郁闷的是我明明配置了JAVA_HOME,并且别的依赖java的东西都能用,通过java -version也 ...
- 搭建SpringMVC+MyBatis开发框架五
建立web结构 1.在webapp目录下新建css.img和js文件夹,删除默认的index.jsp文件:  2.在WEB-INF文件夹下建立一个page文件夹,然后在page下新建一个index. ...
- SQL中的5种聚集函数
作为一个刚毕业进入这行的菜鸟,婶婶的觉的那种大神.大牛到底是怎样炼成的啊,我这小菜鸟感觉这TMD要学的东西这多啊,然后就给自己定了许多许多要学习的东西,可是有人又不停地给你灌输:东西不在多而要精通!我 ...
- 阿里云无线&前端团队是如何基于webpack实现前端工程化的
背景 前端经历了初期的野蛮生长(切图,写简单的特效)——为了兼容浏览器兼容性而出现的各种类库(JQUERY,YUI等——mv*(饱暖思淫欲,代码多了,也就想到怎样组织代码结构,backbone,ang ...
- 重读《Struts In Action》
Figure 1.1. The Java Servlet API exposes the HTTP client/server protocol to the Java platform. S ...
- eclipse 中卸载插件的方法
卸载步骤: Help -> About Eclipse -> Installation Details -> "点到你要删除的插件,如EclipseME" –&g ...
- VS2012配置Lua环境
1.VS2012配置BabeLua插件 2.VS2012配置Lua 1.VS2012配置BabeLua插件 BabeLua插件简介: 安装方法: 关闭VS2012后直接安装BabeLua插件. 下载地 ...