Description

Given a 2D grid, each cell is either an house 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的更多相关文章

  1. 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 ...

  2. Post Office Problem

    Description There are n houses on a line. Given an array A and A[i] represents the position of i-th  ...

  3. 九章lintcode作业题

    1 - 从strStr谈面试技巧与代码风格 必做题: 13.字符串查找 要求:如题 思路:(自写AC)双重循环,内循环读完则成功 还可以用Rabin,KMP算法等 public int strStr( ...

  4. BFS总结

    能够用 BFS 解决的问题,一定不要用 DFS 去做! 因为用 Recursion 实现的 DFS 可能造成 StackOverflow! (NonRecursion 的 DFS 一来你不会写,二来面 ...

  5. sharepoint OOS巨大坑

    首先,我们安装的操作系统是windows server 2016 datacenter最新版,然后安装了OOS2016年的那个版本,打好语言包,安装必备软件,所有的步骤都没问题,但是你配置OOS场的时 ...

  6. 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 ...

  7. UWP?UWP! - Build 2015有些啥?(2)

    UWP?UWP! - Build 2015有些啥? Build 2015圆满落幕了,不知大家有多少人刷夜看了直播呢?不管怎么说,想必各位都很好奇在这场微软开发者盛宴上,Microsoft又发布了什么令 ...

  8. 微软 Build 2016年开发者大会发布多项功能升级

    微软Build 2016开发者大会在美国旧金山的莫斯康展览中心开幕.本次大会对一些重点功能进行了完善.如手写笔支持技术Windows Ink.语音识别Cortana应用集(Cortana Collec ...

  9. 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 ...

随机推荐

  1. springboot结合日志门面SLF4j和日志实现Logback的使用

    一.此处主要介绍在springboot工程下如何使用 logback + slf4j  进行日志记录. logback主要包含三个组成部分:Loggers(日志记录器).Appenders(输出目的在 ...

  2. [笔记] 命令行参数 int main(int argc,char *argv[])

    int main(int argc,char *argv[]) // argument count 变量个数 argument values 变量值 C程序的main函数有两个形参* argc:整数, ...

  3. golang开发:环境篇(六) Go运行监控Supervisord的使用

    为什么要使用Supervisord 17年第一次写Go项目的时候,用Go开发项目倒没没费多大劲,很快就开发完成了.到了在测试环境部署的时候,由于不知道有 Supervisord 这个软件,着实花了些功 ...

  4. Mysql练习题(1)

    表名和字段------------------------------------------------------------------------------–1.学生表Student(s_i ...

  5. 【VUE】1.搭建一个webpack项目

    1.npm之类的安装跳过 2.安装npm install -g @vue/cli-init 初始化项目目录 vue init webpack vue_cutter_point_blog_admin 并 ...

  6. DISPLAY FORMAT 語法

  7. 入门篇-contrail-command(对接openstack)All-In-One

    基础环境 系统: centos7.6(3.10.0-957) 64G内存 500G磁盘 关闭防火墙 systemctl disable firewalld 关闭selinux sed -i 's/SE ...

  8. 所有子模块都要执行的checkstyle检查

    <!-- 所有子模块都要执行的checkstyle检查 --> <plugin> <groupId>org.apache.maven.plugins</gro ...

  9. C# List<string>之间的转换

    List<string> 转换为 string List<string> list = new List<string>(); list.Add("a&q ...

  10. JUC - ThreadPoolExecutor

    JUC - ThreadPoolExecutor 创建一个ThreadPoolExecutor ThreadPoolExecutor( int corePoolSize, // 保留在池中的线程数,即 ...