返回

全面理解单调栈: LeetCode 1673 Python代码剖析

后端

在计算机科学领域,掌握单调栈算法是解决一系列编程难题的关键。为了帮助您提升技能,我们将使用 LeetCode 1673:寻找最具竞争力的子序列,通过 Python 代码示例详细解析单调栈的运作原理和应用。

单调栈:维护一个递减序列

单调栈是一种数据结构,它维护了一个递减的元素序列。当遇到一个新的元素时,如果它比栈顶元素小,则将栈顶元素弹出,直到遇到一个比它小的元素或栈为空。通过这种方式,栈中始终保持一个递减的元素序列。

在 LeetCode 1673 中,我们可以使用单调栈来解决问题。我们从后往前遍历数组,每次遇到一个元素时,将其与栈顶元素进行比较。如果它比栈顶元素小,则将栈顶元素弹出,并继续比较。直到遇到一个比它小的元素或栈为空,则将元素推入栈中。

def mostCompetitive(nums, k):
  stack = []
  for num in nums:
    while stack and stack[-1] > num and len(stack) + len(nums) - i > k:
      stack.pop()
    if len(stack) < k:
      stack.append(num)
  return stack

在这个 Python 代码中,我们维护了一个递减的栈,并在遍历数组时不断更新它。当我们遇到一个比栈顶元素小的元素时,我们弹出栈顶元素,直到遇到一个比它小的元素或栈为空。然后,我们将元素推入栈中。最后,我们返回栈中的前 k 个元素,它们就是最具竞争力的子序列。

贪心算法:做出局部最优决策

贪心算法是一种解决问题的策略,它通过在每一步做出局部最优决策来找到全局最优解。在 LeetCode 1673 中,我们可以使用贪心算法来找到最具竞争力的子序列。

贪心算法从数组的第一个元素开始,并选择它作为子序列的第一个元素。然后,它从剩下的元素中选择比当前最后一个元素小的最大元素,并将其添加到子序列中。它继续重复此过程,直到子序列长度达到 k。

def mostCompetitive(nums, k):
  subsequence = []
  for num in nums:
    while subsequence and subsequence[-1] > num and len(subsequence) + len(nums) - i > k:
      subsequence.pop()
    if len(subsequence) < k:
      subsequence.append(num)
  return subsequence

在这个 Python 代码中,我们维护一个子序列,并不断更新它。当我们遇到一个比当前最后一个元素小的元素时,我们从子序列中弹出最后一个元素,直到子序列为空或遇到一个比它小的元素。然后,我们将元素添加到子序列中。最后,我们返回子序列的前 k 个元素,它们就是最具竞争力的子序列。

结论

在本文中,我们深入探究了单调栈和贪心算法,并通过 LeetCode 1673 题目展示了它们的应用。通过理解单调栈维护递减序列和贪心算法做出局部最优决策的原理,我们掌握了解决这类问题的强大工具。希望这篇教程对您的学习有所帮助,欢迎您留言讨论和分享您的见解。