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. C++静态库与动态库的区别

    在日常开发中,其实大部分时间我们都会和第三方库或系统库打交道.在 Android 开发音视频开发领域,一般会用到 FFmepg.OpenCV.OpenGL 等等开源库, 我们一般都会编译成动态库共我们 ...

  2. Python学习之路:通过分片的方式修改列表的技巧(拓展知识)

    一.为列表添加值 用分片的方式可以在列表的头部和尾部添加值 1.在列表的头部添加值 x = [1, 2, 3] #创建列表x x[:0] = [0] #用分片的方式在列表头部添加值 print(x) ...

  3. js中对字符串操作的常见方法(1)

    String类型 创建一个String类型的实例 var stringObject = new String("hello world"); String类型的属性 length; ...

  4. lcd12864菜单

    最近一段时间学习了一下lcd12864屏幕的驱动(本人使用的是带字库的st7920驱动芯片). 1.该屏幕可以是串行驱动,或者并行驱动. 2.该屏幕的显示分为2部分,文字显示区DDRAM,图像显示区G ...

  5. Kafka理解

    1. 引言 最近使用Kafka做消息队列时,完成了基本的消息发送与接收,已上线运行.一方面防止出现Bug时自己不能及时定位问题,一方面网上的配置可能还可以更加优化,决定去了解下Kafka. 2. 配置 ...

  6. mongoDB对没有字段的记录新增字段

    db.getCollection('ClassRecordOneDetail').updateMany({'synState':{'$exists':false}},{'$set':{'synStat ...

  7. Source roots (or source folders) Test source roots (or test source folders; shown as rootTest)Resource rootsTest resource roots

    idea中Mark Directory As里的Sources Root.ReSources Root等的区别 1.Source roots (or source folders) 通过这个类指定一个 ...

  8. selenium自学笔记---下拉框定位元素select

    下拉框1.先定位select 然后在定位option city = driver.find_element_by_id("selCities_0") city.find_eleme ...

  9. Requirements management in confluence

    https://ja.confluence.atlassian.com/doc/blog/2015/08/how-to-document-product-requirements-in-conflue ...

  10. vsftp 常见配置测试与故障排除

    匿名用户 /var/ftp        本地用户 /home/username配置vsftpd时,强烈建议·# cp /etc/vsftpd.conf /etc/vsftpd.conf1       ...