最佳聚会地点
-
题目:给定一个二维数组,其中的值不是0就是1;0代表空地、1代表人,整个矩阵中没有障碍,任何地点都可通行。现在想在矩阵里选一个地点开会,所有人都去往该地点,请问选哪个地点能让所有人移动的总距离最短?
0行0列 0行1列 ... 0行m列 1行0列 1行1列 ... 1行m列 ... ... ... ... n行0列 n行1列 ... n行m列
-
题目分析
- “整个矩阵中没有障碍”——即人可以到达矩阵的各个地方,也可以途径任何一个点(从空地经过或者和人错身而过)。
- “选出地点”——选择最优的行、再选择最优的列,交叉处即为最佳地点。
- 下面以行为例介绍算法思想。
-
算法思想(双指针)
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、以同样的方法选出最优列,最优行和最优列交汇处为最优地点。
-