视频字幕
想象你和朋友们住在一个棋盘一样的城市里,每个人的家都分布在不同的位置。现在市长想在城市里建一个展览馆,我们希望选一个大家总路程最短的地点。在这种网格城市中,我们使用曼哈顿距离来计算路程,它等于横向距离加上纵向距离。这个问题可以形象地类比为:如何选择一个集合地点,让所有小伙伴来回走的路加起来最少?
先看简单的一维情形:假如所有人的位置都在一条直线上,比如乡村公路或街道。我们想在这条线上选一个集合点,使得所有人走路距离之和最小。这个最佳集合点就在所有人的位置中位数那里。把每个人的位置想象成跷跷板上的一个小朋友,想找到跷跷板的支点位置使两边平衡。只有当集合点在正中间,也就是中位数的位置时,左右两边的人数相当,总路程也最短。
城市里的房屋在二维平面上,我们的曼哈顿距离是横向距离加纵向距离。幸运的是,二维的曼哈顿距离问题可以拆解为两个一维问题。我们可以分别决定集合点的横坐标和纵坐标,各自让水平方向和竖直方向的总距离最小。把所有人的x坐标抽出来,用中位数找到最佳横向位置。把所有人的y坐标抽出来,用中位数找到最佳纵向位置。两者的交汇点就是最佳集合点。
通过具体数值例子演示排序和中位数查找过程。首先将所有坐标排序,然后找中间位置。如果人数是奇数,中位数唯一,最佳点只有一个。比如五个数1、3、7、8、9,排序后中位数是7。如果人数是偶数,会有两个中间值,这两个值之间的所有整数位置都是最优的。比如四个数2、4、10、12,中间两个是4和10,那么从4到10之间有7个整数都可以作为最佳位置。
现在用一个具体例子演示算法执行过程。假设有4个朋友,坐标分别是(1,0)、(0,1)、(-1,0)、(0,-1)。首先提取横坐标[1,0,-1,0],排序得到[-1,0,0,1],中间两个值都是0。纵坐标[0,1,0,-1],排序得到[-1,0,0,1],中间两个值也都是0。由于中间值相同,横向和纵向的最佳范围都只有1个点,所以答案是1乘以1等于1。最佳集合点就是(0,0),每个朋友到这里的距离都是1,总距离是4,这是所有可能位置中最小的。