Build Post Office
Description
1
or empty 0
(the number zero, one), find the place to build a post office, the distance that post office to all the house sum is smallest. Return the smallest distance. Return -1
if it is not possible.- You can pass through house and empty.
- You only build post office on an empty.
- The distance between house and the post office is Manhattan distance
Example
Example 1:
Input:[[0,1,0,0],[1,0,1,1],[0,1,0,0]]
Output: 6
Explanation:
Placing a post office at (1,1), the distance that post office to all the house sum is smallest.
Example 2:
Input:[[0,1,0],[1,0,1],[0,1,0]]
Output: 4
Explanation:
Placing a post office at (1,1), the distance that post office to all the house sum is smallest.
思路:
方法一:
- 由于题中所求两点间距离表示为d(i,j)=|xi-xj|+|yi-yj|,所以可以在x方向和y方向分别计算,然后求和即可,实现一维方向的计算即可。
- 首先遍历网格,为1的方格,将其横纵坐标,即i和j分别存储,然后排序,方便接下来的查找计算。然后利用sumx和sumy前缀和,sumx代表起点到各个点的x方向距离和,sumy同理。
- 再次遍历网格,当前处为0时,首先二分查找该方向i或j的位置,如果有多个相同的,寻找最右边的,即可,设为index。
- 然后求和即可
- sum.get(n) - sum.get(index + 1) - pos * (n - index - 1) + (index + 1) * pos - sum.get(index + 1);
- sum.get(n) - sum.get(index + 1)计算出当前点右侧部分到起点的距离和
- pos * (n - index - 1) 减去多余部分,因为之前是到起点的距离和,现在要求到当前点的距离和
- (index + 1) * pos - sum.get(index + 1) 此处开始计算当前点左侧部分,index+1个当前点距离和减去index+1到起点的距离和,即为左侧部分的距离和。
方法二:
- 处理前缀:
prefixSum1记录数组 a 的前缀和,即:prefixSum1[i]=a[0]+a[1]+..+a[i].
prefixSum2记录数组 prefixSum1 前缀和,prefixSum2即为前 i 个点到第 i 个点的代价和。 - 处理后缀:
prefixSum1记录数组 a 的后缀和,即:prefixSum1[i]=a[n-1]+a[n-2]+..+a[i].
prefixSum2记录数组 prefixSum1 的后缀和,prefixSum2即为 i 之后的点到第 i 个点的代价和。public class Solution {
/**
* @param grid: a 2D grid
* @return: An integer
*/
public int shortestDistance(int[][] grid) {
// Write your code here
int n = grid.length;
if (n == 0)
return -1; int m = grid[0].length;
if (m == 0)
return -1; List<Integer> sumx = new ArrayList<Integer>();
List<Integer> sumy = new ArrayList<Integer>();
List<Integer> x = new ArrayList<Integer>();
List<Integer> y = new ArrayList<Integer>(); int result = Integer.MAX_VALUE;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (grid[i][j] == 1) {
x.add(i);
y.add(j);
} Collections.sort(x);
Collections.sort(y); int total = x.size(); sumx.add(0);
sumy.add(0);
for (int i = 1; i <= total; ++i) {
sumx.add(sumx.get(i-1) + x.get(i-1));
sumy.add(sumy.get(i-1) + y.get(i-1));
} for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (grid[i][j] == 0) {
int cost_x = get_cost(x, sumx, i, total);
int cost_y = get_cost(y, sumy, j, total);
if (cost_x + cost_y < result)
result = cost_x + cost_y;
} return result;
} public int get_cost(List<Integer> x, List<Integer> sum, int pos, int n) {
if (n == 0)
return 0;
if (x.get(0) > pos)
return sum.get(n) - pos * n; int l = 0, r = n - 1;
while (l + 1 < r) {
int mid = l + (r - l) / 2;
if (x.get(mid) <= pos)
l = mid;
else
r = mid - 1;
} int index = 0;
if (x.get(r) <= pos)
index = r;
else
index = l;
return sum.get(n) - sum.get(index + 1) - pos * (n - index - 1) +
(index + 1) * pos - sum.get(index + 1);
}
}
Build Post Office的更多相关文章
- Build Post Office II
Description Given a 2D grid, each cell is either a wall 2, an house 1 or empty 0 (the number zero, o ...
- Post Office Problem
Description There are n houses on a line. Given an array A and A[i] represents the position of i-th ...
- 九章lintcode作业题
1 - 从strStr谈面试技巧与代码风格 必做题: 13.字符串查找 要求:如题 思路:(自写AC)双重循环,内循环读完则成功 还可以用Rabin,KMP算法等 public int strStr( ...
- BFS总结
能够用 BFS 解决的问题,一定不要用 DFS 去做! 因为用 Recursion 实现的 DFS 可能造成 StackOverflow! (NonRecursion 的 DFS 一来你不会写,二来面 ...
- sharepoint OOS巨大坑
首先,我们安装的操作系统是windows server 2016 datacenter最新版,然后安装了OOS2016年的那个版本,打好语言包,安装必备软件,所有的步骤都没问题,但是你配置OOS场的时 ...
- How to Build Office Developer Tools Projects with TFS Team Build 2012
Introduction Microsoft Visual Studio 2012 provides a new set of tools for developing apps for Office ...
- UWP?UWP! - Build 2015有些啥?(2)
UWP?UWP! - Build 2015有些啥? Build 2015圆满落幕了,不知大家有多少人刷夜看了直播呢?不管怎么说,想必各位都很好奇在这场微软开发者盛宴上,Microsoft又发布了什么令 ...
- 微软 Build 2016年开发者大会发布多项功能升级
微软Build 2016开发者大会在美国旧金山的莫斯康展览中心开幕.本次大会对一些重点功能进行了完善.如手写笔支持技术Windows Ink.语音识别Cortana应用集(Cortana Collec ...
- Devexpress VCL Build v2014 vol 15.2.3 发布
2016年第一个版本,继续修补. New Major Features in 15.2 What's New in VCL Products 15.2 Breaking Changes To lear ...
随机推荐
- [转帖]UML类图新手入门级介绍
UML类图新手入门级介绍 2010-11-12 19:45:00 monkey_d_meng 阅读数 27230 收藏 文章标签: umlinterfaceclass编程扩展更多 分类专栏: 软件工 ...
- [转帖]关于4A(统一安全管理平台)系统的理解
雪山上的蒲公英 https://www.cnblogs.com/zjfjava/p/10674577.html 关于4A(统一安全管理平台)系统的理解 1. 4A系统的需求分析 近年来企业用户的业 ...
- Connection to 天mysql failed. [08001] Could not create connection to database server. Attempted ,报错处理方法
https://blog.csdn.net/myzh215219/article/details/90314345 点击图上的DRIVER,然后点击GO TO DRIVER,之后更改合适的驱动. 我的 ...
- .net Dapper 学习系列(2) ---Dapper进阶
目录 写在前面 前期准备 Dapper 单表批量添加 在Dapper 多表查询 在Dapper 调用存储过程 在Dapper 使用QueryMultiple进行多表查询 在Dapper 使用事务进行多 ...
- CentOS7配置网卡上网、安装wget、配置163yum源
2019/09/12,CentOS 7 VMware 摘要:CentOS7安装完成(最小化安装)后,不能联网(已选择桥接网络),需要修改配置文件及配置yum源 修改配置文件 进入网卡配置目录 cd / ...
- 2019 龙采科技java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.龙采科技等公司offer,岗位是Java后端开发,最终选择去了龙采科技. 面试了很多家公司,感觉大部分公司考察的点 ...
- Matlab代码优化之道
一. 遵守Performance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件.1.只有使用以下数据类型,matlab才会 ...
- 又一个秘密如何让浏览器访问最新的js,css等外部引用
在引用文件末尾加上一个参数,让浏览器知道这个文件跟上一个文件是不同的,让浏览器去服务器重新加载最新的,例如:<script type="text/javascript" sr ...
- react学习记录(二)
JSX 在render中return标签的部分可以插入字符串,数字,数组 class Welcome extends React.Component { render(){ return ( < ...
- 日志 logback-spring.xml配置
文章转载自: https://blog.csdn.net/xu_san_duo/article/details/80364600 logback-spring.xml配置文件 1. 自己改下value ...