数据结构与算法之 leetcode 贪心算法最佳观光组合算法 双指针

数据结构与算法阿木 发布于 2025-07-12 15 次阅读


贪心算法最佳观光组合算法(双指针)解析与实现

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。在解决某些问题时,贪心算法能够提供一种简单而有效的方法。本文将围绕LeetCode上的“最佳观光组合”问题,探讨贪心算法与双指针技术的结合,实现一个高效的解决方案。

问题分析

LeetCode上的“最佳观光组合”问题如下:

给定一个数组 `nums`,其中包含一些整数,每个整数代表观光点的评分。假设你从数组的第一个点开始观光,每观光一个点,你可以选择继续观光下一个点,也可以选择结束观光。要求找出观光组合的最佳评分,即观光点的评分总和最大。

例如,给定数组 `nums = [8, 1, 5, 2, 6]`,观光组合的最佳评分是 `8 + 5 + 6 = 19`。

解题思路

为了解决这个问题,我们可以使用贪心算法结合双指针技术。以下是解题思路:

1. 首先对数组进行排序,使得评分较高的观光点排在前面。

2. 使用两个指针,一个指向当前观光的起始点 `start`,另一个指向当前观光的结束点 `end`。

3. 从起始点开始,逐步增加结束点,计算当前观光组合的评分。

4. 如果当前观光组合的评分大于之前记录的最佳评分,则更新最佳评分。

5. 当结束点到达数组末尾时,结束观光,记录当前最佳评分。

代码实现

下面是使用Python实现的代码:

python

def maxScoreSightseeingPair(nums):


对数组进行排序


nums.sort()


初始化最佳评分


max_score = 0


初始化起始指针


start = 0


遍历数组,使用双指针技术


for end in range(1, len(nums)):


更新最佳评分


max_score = max(max_score, nums[end] + nums[start])


移动起始指针


start += 1


return max_score

测试代码


nums = [8, 1, 5, 2, 6]


print(maxScoreSightseeingPair(nums)) 输出:19


时间复杂度分析

该算法的时间复杂度为O(n),其中n为数组的长度。这是因为我们只需要遍历一次数组,对数组进行排序的时间复杂度为O(nlogn),而双指针遍历的时间复杂度为O(n)。

总结

本文通过分析LeetCode上的“最佳观光组合”问题,探讨了贪心算法与双指针技术的结合。通过排序和双指针遍历,我们能够高效地找到观光组合的最佳评分。在实际应用中,我们可以根据问题的特点,灵活运用贪心算法和双指针技术,解决更多类似的问题。