最佳聚会地点

467 阅读2分钟

最佳聚会地点

  • 题目:给定一个二维数组,其中的值不是0就是1;0代表空地、1代表人,整个矩阵中没有障碍,任何地点都可通行。现在想在矩阵里选一个地点开会,所有人都去往该地点,请问选哪个地点能让所有人移动的总距离最短?

    0行0列0行1列...0行m列
    1行0列1行1列...1行m列
    ............
    n行0列n行1列...n行m列
  • 题目分析

    1. “整个矩阵中没有障碍”——即人可以到达矩阵的各个地方,也可以途径任何一个点(从空地经过或者和人错身而过)。
    2. “选出地点”——选择最优的行、再选择最优的列,交叉处即为最佳地点。
    3. 下面以行为例介绍算法思想。
  • 算法思想(双指针)

    1、上指针指向首行,下指针指向尾行。

    上指针 ——> 0行10个人
    1~n-1行E个人
    下指针 ——> n行6个人

    2、比较上指针所指及以上的区域下指针所指及以下的区域这两块区域的优劣:

    • 假设最佳行为n行,此时需要:

      • 将0行的10个人从0行移到n行(10人 0行——>n行)
      • 将E个人移到 n 行(E人 ——>n行)

    此时考虑n行的上一行,即n-1行

    上指针 ——> 0行10个人
    1~n-2行M个人
    n-1行8个人
    下指针 ——> n行6个人
    • 假设最佳行为n-1行,此时需要:

      • 将 0 行的 10个人从 0 行移到 n-1 行(10人 0 行——>n-1 行) == 节省 10 步
      • 将 n 行的 6个人从 n 行移到 n-1 行(6人 n 行——>n-1 行) == 增加 6 步
      • 将 M个人移到 n-1 行(M人 ——>n-1行)
    • 显然n-1行更优,所以n行不可能是最佳行,此时下指针向上跳动一行,即指向n-1行。

    上指针 ——> 0行10个人
    1~n-2行M个人
    下指针 ——> n-1行8个人
    n行6个人

    由上述推理可知,上下两块区域中,哪一块的人数少,则该区域不是最优行。

    • 此时上指针包含区域为10人,下指针包含区域为14人,可知 0 行不是最优行,上指针向下跳动一行,即指向1行。

    3、重复第二步的步骤,直至上下指针定位到其中一行,此行为最优行。


    4、以同样的方法选出最优列,最优行和最优列交汇处为最优地点。