返回

解锁 LeetCode 上分新姿势:单调栈 + 贪心算法秘诀

闲谈

踏上 LeetCode 周赛上分之旅 #39:单调栈 + 贪心的组合妙招

在这个风云变幻的竞技场中,想要脱颖而出,就必须掌握高超的技巧。本期 LeetCode 周赛,我们将为你揭晓一道精彩题目的解题秘籍:单调栈 + 贪心算法 的巧妙结合,让你轻松上分。

征途启程:理解问题核心

本题要求我们求解一个数组中,每个元素两侧距离最近且比它大的元素的距离。乍一看,这似乎是一个繁琐的问题,但仔细分析后,我们会发现它与「下一个更大元素」问题有着异曲同工之妙。

单调栈登场:寻找下一个更大值

当我们从左到右遍历数组时,可以借助单调栈来高效地求解每个元素的下一个更大值。单调栈是一种特殊的栈结构,栈顶元素始终是栈中最大的元素。

通过将较小的元素依次压入栈中,并随时弹出较大的元素,我们可以快速得到每个元素的下一个更大值。而这正是本题解题的关键一步。

贪心策略:扩展中心点

有了每个元素的下一个更大值,我们就可以使用贪心策略来扩展中心点。对于数组中的每个元素,我们首先向左扩展,即向下一个更大值移动。然后,我们再向右扩展,同样向下一个更大值移动。

这样,我们就可以求出每个元素两侧距离最近且比它大的元素的距离。

算法实现:代码示例

def getDistances(arr):
    # 单调栈求解下一个更大值
    stack = []
    next_greater = {}
    for i in range(len(arr)):
        while stack and arr[stack[-1]] < arr[i]:
            next_greater[stack.pop()] = i
        stack.append(i)

    # 贪心策略求解两侧距离
    distances = []
    for i in range(len(arr)):
        left_dist = next_greater.get(i, len(arr)) - i
        right_dist = i - stack[0] if stack else len(arr)
        distances.append(left_dist + right_dist)

    return distances

总结与展望

通过巧妙结合单调栈和贪心算法,我们成功解决了 LeetCode 周赛 #39 的难题。这种组合技法在解决类似问题时有着广泛的应用前景。在未来的周赛中,让我们继续探索算法的奥妙,在 LeetCode 的战场上纵横捭阖。

附录: