阿D的最佳飞行路线探索 | 豆包MarsCode AI刷题

60 阅读4分钟

问题描述

小C和他的领导小F计划一次飞行,但由于严格的航空管制,他们的飞机仅能按特定的路线飞行:飞机只能飞往当前机场的相邻机场或相同航空公司管理的机场。为了减少起飞次数,小C需要制定最优的飞行路线。机场由一个数组airports标识,其中:

  • 数组每个元素代表一个独特的机场,元素的值代表不同的航空公司。
  • airports[0]为起点,airports[airports.length - 1]为终点。
  • 假设小C当前在机场i,那么i - 1i + 1(如果存在)代表邻近机场,飞机可以直接前往。
  • 如果在机场i,且存在airports[i] == airports[j],则机场i和机场j同属一家航空公司,可直接飞往。

求最小起飞次数。


测试样例

样例1:

输入:airports = [10, 12, 13, 12, 14]
输出:3

样例2:

输入:airports = [10, 11, 12, 13, 14]
输出:4

样例3:

输入:airports = [7, 7, 7, 8, 9, 7]
输出:1

思路

这道题目其实其实没有看起来这么复杂,本质上是数组中相同元素的遍历,我们使用正常的遍历数组就可以解决,要注意的主要有以下几点:

  1. 把一次索引的变化看作一次飞行
  2. 相同机场应该在最远处降落
  3. 后续没有相同机场要将索引更新到下一索引,同时计数器计数

代码解释

def solution(a): 
pointer = 0 count = 0
  • 这里定义了函数solution,它接受一个参数a,在本题情境下可想象成类似airports的数组。然后初始化了两个变量:pointer用于指向数组中的当前位置,初始化为 0,可类比在机场行程中从起点开始考察;count用于计数,初始化为 0,这里可想象成记录某种行程阶段变化的次数,在本题中类似于记录起飞次数的初始累计值。
while pointer < len(a):
same_element_indices = [i for i in range(pointer + 1, len(a)) if a[pointer] == a[i]]
  • 进入一个while循环,只要pointer小于数组a的长度,就持续循环,这类似于在考察整个行程路径(所有机场)的过程中。在每次循环中,通过列表推导式创建了same_element_indices列表,它找出了在当前位置pointer之后且与当前位置元素值相同的所有索引。在本题情境中,就好比找出了与当前机场同属一家航空公司的其他机场的索引(除当前机场外)。
if same_element_indices:
farthest_index = max(same_element_indices) pointer = farthest_index count += 1
else: pointer += 1 count += 1
  • 如果same_element_indices列表不为空,说明存在与当前位置元素值相同的其他元素(类似存在同属一家航空公司的其他机场)。此时,找出这些相同元素索引中的最大值farthest_index,并将pointer更新为这个最大值,这可以想象成在同属一家航空公司的机场中选择了一个相对最远的机场作为下一个考察点(类似于选择一个合适的同公司机场前往),然后count加 1,可类比完成了一次 “行程转换”,在本题中类似完成了一次起飞操作。
return count

最后 返回结果

总结

 贪心算法思想的实践应用

我们展示了贪心算法思想在实际问题中的一种别样应用方式。通常我们对贪心算法的理解可能更多地局限于一些标准示例,如找零钱问题等。但通过本题代码,我们看到了即使在没有完全遵循传统贪心算法模式的情况下,依然可以从问题的本质出发,挖掘出其中蕴含的贪心特性,并通过合理的逻辑设计将其应用到实际问题的解决中。这启示我们在面对复杂问题时,要深入分析问题的内在逻辑,尝试寻找其中可能存在的贪心关系,以便能够运用这种相对简单而高效的算法思想来找到解决方案。