青训营X豆包MarsCode AI刷题中理想火车站定位一题要求实现一个根据曼哈顿距离选择最优火车站位置的算法。
输入和问题描述
输入:
n:市民的数量。m:备选火车站位置的数量。citizens:一个包含市民位置的列表,每个市民的位置是一个坐标 [x,y][x,y]。locations:一个包含火车站位置的列表,每个火车站的位置是一个坐标 [x,y][x,y]。
目标:
选择一个最优的火车站位置,使得所有市民到该火车站的曼哈顿距离之和最小。如果有多个火车站的位置距离和相同,则选择第一个出现的那个位置。
代码解析
1. 初始化最小距离和最佳位置
pythonCopy Code
min_distance = float('inf')
best_location = None
min_distance初始化为正无穷,表示当前没有计算任何距离时的一个最大值。best_location用于存储当前的最优火车站位置。
2. 遍历每个火车站位置
pythonCopy Code
for loc in locations:
- 对于每一个备选火车站位置
loc,我们将计算该位置到所有市民的曼哈顿距离总和。
3. 计算该位置到所有市民的曼哈顿距离
pythonCopy Code
total_distance = 0
for citizen in citizens:
total_distance += abs(loc[0] - citizen[0]) + abs(loc[1] - citizen[1])
total_distance初始化为 0。- 对于每一个市民
citizen,计算该市民与当前火车站位置loc之间的曼哈顿距离,并累加到total_distance中。
曼哈顿距离公式为:
distance=∣x1−x2∣+∣y1−y2∣distance=∣x1−x2∣+∣y1−y2∣
因此,对于每个市民与火车站的横纵坐标之差求绝对值,再相加得到距离。
4. 更新最优火车站位置
pythonCopy Code
if total_distance < min_distance:
min_distance = total_distance
best_location = loc
- 如果当前火车站位置
loc到所有市民的曼哈顿距离total_distance小于当前记录的min_distance,则更新最小距离min_distance和最佳位置best_location。
5. 返回最优火车站位置
pythonCopy Code
return best_location
- 当所有备选位置都遍历完后,返回距离和最小的火车站位置。
测试代码分析
代码包含多个测试用例,验证了不同的情况,确保算法的正确性。
测试用例 1
pythonCopy Code
citizens1 = [[-1, -1], [-1, 1], [1, -1], [1, 1]]
locations1 = [[3, 2], [1, 0], [0, 0]]
print(solution(4, 3, citizens1, locations1) == [1, 0])
- 市民位置有 4 个,分别是
(-1, -1),(-1, 1),(1, -1),(1, 1)。 - 备选火车站位置有 3 个,分别是
(3, 2),(1, 0),(0, 0)。 - 计算每个火车站到所有市民的曼哈顿距离和,最终选择距离和最小的火车站
[1, 0]。
测试用例 2
pythonCopy Code
citizens2 = [[0, 0], [0, 4]]
locations2 = [[0, 2], [0, 3]]
print(solution(2, 2, citizens2, locations2) == [0, 2])
- 市民位置有 2 个,分别是
(0, 0)和(0, 4)。 - 备选火车站位置有 2 个,分别是
(0, 2)和(0, 3)。 - 计算每个火车站到所有市民的曼哈顿距离和,最终选择距离和最小的火车站
[0, 2]。
测试用例 3
pythonCopy Code
citizens3 = [[10, 10], [20, 20], [30, 30]]
locations3 = [[15, 15]]
print(solution(3, 1, citizens3, locations3) == [15, 15])
- 市民位置有 3 个,分别是
(10, 10),(20, 20),(30, 30)。 - 备选火车站位置只有一个
[15, 15],直接选择这个位置作为最优位置。
测试用例 4
pythonCopy Code
citizens4 = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
locations4 = [[4, 5], [6, 7], [8, 9]]
print(solution(5, 3, citizens4, locations4) == [4, 5])
- 市民位置有 5 个,备选火车站位置有 3 个。
- 计算每个火车站到所有市民的曼哈顿距离和,最终选择距离和最小的火车站
[4, 5]。
测试用例 5
pythonCopy Code
citizens5 = [[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60]]
locations5 = [[35, 35], [45, 45]]
print(solution(6, 2, citizens5, locations5) == [35, 35])
- 市民位置有 6 个,备选火车站位置有 2 个。
- 计算每个火车站到所有市民的曼哈顿距离和,最终选择距离和最小的火车站
[35, 35]。
时间复杂度
- 外层循环遍历所有备选火车站位置,次数为
m。 - 内层循环遍历所有市民,次数为
n。 - 每次计算曼哈顿距离的复杂度是常数时间 O(1)O(1),因此总体时间复杂度为 O(m×n)O(m×n)。
空间复杂度
- 由于我们只使用了几个辅助变量,并且没有使用额外的复杂数据结构,因此空间复杂度是 O(1)O(1),即常数级空间。
总结
该代码实现了一个经典的“最优位置选择”问题,通过计算每个备选位置到所有市民的曼哈顿距离和,找出最优的火车站位置。通过遍历和计算距离,算法在合理的时间内完成任务。