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 ...
随机推荐
- RHEL6.4找回root密码的方法
1.先在系统启动的时候提示:press any key to enter menu 时按下e键(其实其他键也可以,只不过我习惯e键而已) 2.进入如下界面: 3.按上下箭头方向键选中第二项,按e键,进 ...
- vbs操作txt文本文件常用方法(函数)
创建文件 dim fso, f set fso = server.CreateObject("Scripting.FileSystemObject") set f = fso.Cr ...
- 互联网产品设计常用文档类型-BRD、MRD、PRD、FSD (
BRD Business Requirements Document,商业需求文档.这是产品声明周期中最早的问的文档,再早就应该是脑中的构思了,其内容涉及市场分析,销售策略,盈利预测等,通常是和老大们 ...
- 3527: [Zjoi2014]力 - BZOJ
题目大意:给出n个数qi,定义 Fj为 令 Ei=Fi/qi,求Ei. 看了很久题解,终于有些眉目,因为知道要用FFT,所以思路就很直了 其实我们就是要±1/(j-i)^2 ( j-i大 ...
- 【CentOS】Eclipse中svn插件使用
目录: 1.安装 2.使用 3.错误 1.安装 svn插件地址: Subclipse 1.6.x Update Site - http://subclipse.tigris.org/update_1. ...
- SimpleDateFormat
范例: Date date = new Date();SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MMM-dd,E,HH. ...
- 剑指offer-17题
题目要求:输入一个表示整数的字符串,把该字符串转换成整数并输出.例如输入字符串"345",则输出整数345. 分析:这道题能够很好地反应出程序员的思维和编程习惯. 的确,自己编写的 ...
- JavaScript在IE6,IE7下报错'expected identifier, string or number'
问题: 代码在Forefox和IE8下工作正常,但是在IE6下报错: expected identifier, string or number 假如变量options有多个选项,那么我们可以用逗号分 ...
- 最小PE文件讨论
1.实例1国外的人写的最小的PE文件--97Bytes 4D5A0000504500004C0101006A2A58C30000000000000000040003010B01080004000000 ...
- Windows Live Writer安装失败错误解决方案
初次使用博客园.看到官方推荐Windows Live Writer来写作博客.看着也不错.可以离线写作.不用担心浏览器突然卡卡卡,未响应的危险. Windows Live Writer是博客园推荐博客 ...