知识点详解
1. 曼哈顿距离(Manhattan Distance)
曼哈顿距离是一种特殊的距离度量方式,用于计算在标准坐标系上的两点之间的距离。在本问题中,它被定义为两点横纵坐标差的绝对值之和,即 |x1 - x2| + |y1 - y2|。这种距离度量方式适用于像城市街道这样的网格状布局。
2. 列表和元组
- 列表(List) :Python 中的列表是一种有序的集合,可以包含任意类型的元素,支持增删改查等操作。
- 元组(Tuple) :元组与列表类似,但它是不可变的,一旦创建就不能修改。元组通常用于存储不应改变的数据。
3. 循环结构
Python 中的 for 循环用于遍历序列(如列表、元组)中的每个元素。在本问题中,我们需要使用循环来遍历所有市民的位置和所有可能的火车站位置。
4. 条件判断
使用 if 语句来进行条件判断。在本问题中,我们需要判断当前火车站位置的总距离是否小于已知的最小距离,以决定是否更新最小距离和最优位置。
5. 绝对值函数
Python 中的 abs() 函数用于计算一个数的绝对值。在计算曼哈顿距离时,我们需要使用绝对值来确保距离始终为非负数。
解题思路
- 初始化:设置一个足够大的初始最小距离和一个初始的最优位置。
- 遍历备选位置:对每个备选的火车站位置进行遍历。
- 计算总距离:对于每个备选位置,计算它到所有市民的曼哈顿距离总和。
- 更新最优位置:如果当前备选位置的总距离小于已知的最小距离,则更新最小距离和最优位置。
- 返回结果:遍历结束后,返回最优位置。
代码讲解
python
def solution(n, m, citizens, locations):
# 初始化最小距离为无穷大,表示尚未找到更小的距离
min_distance = float('inf')
# 初始化最优位置为 [-1, -1],表示尚未找到最优位置
best_location = [-1, -1]
# 遍历所有火车站备选位置
for loc in locations:
# 初始化当前位置的总距离为0
total_distance = 0
# 遍历所有市民的位置
for citizen in citizens:
# 计算当前火车站位置到当前市民的曼哈顿距离,并累加到总距离
total_distance += abs(citizen[0] - loc[0]) + abs(citizen[1] - loc[1])
# 如果当前总距离小于已知的最小距离,则更新最小距离和最优位置
if total_distance < min_distance:
min_distance = total_distance
best_location = loc
# 返回最优位置
return best_location
代码分析
- 函数定义:
solution函数接受市民人数n、备选位置数m、市民位置列表citizens和备选位置列表locations作为参数。 - 循环结构:使用两层
for循环,外层循环遍历备选位置,内层循环遍历市民位置。 - 条件判断:使用
if语句来判断是否需要更新最小距离和最优位置。 - 返回值:函数返回最优位置的坐标。