返回
解锁 LeetCode 上分新姿势:单调栈 + 贪心算法秘诀
闲谈
2024-02-17 23:16:47
踏上 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 的战场上纵横捭阖。