返回

Python中利用单调栈巧妙移除K位数字:LeetCode 402

后端

在LeetCode 402题中,我们面临的挑战是给定一个表示非负整数的字符串,我们需要从中移除K位数字,得到一个尽可能小的结果。为了解决这个问题,我们可以巧妙地利用单调栈的数据结构。

单调栈简介

单调栈是一种特殊的栈,其中元素按特定顺序排列。单调栈的性质之一是,新元素在入栈时只会与栈顶元素比较。如果新元素满足单调性要求(例如,递增或递减),则将其入栈;否则,栈顶元素将被弹出。

应用单调栈解决402题

对于LeetCode 402题,我们可以使用一个递减单调栈。具体算法步骤如下:

  1. 从字符串开头遍历数字,将每个数字入栈。
  2. 如果栈顶数字大于当前数字,则弹出栈顶数字。
  3. 重复步骤2,直到栈为空或达到要移除的数字数量K。
  4. 将栈中剩余的数字按出栈顺序拼接起来,得到结果字符串。

边界条件处理

在应用单调栈算法时,需要考虑以下边界条件:

  • 如果K大于或等于字符串的长度,则结果为"0"。
  • 如果字符串中没有重复数字,则无需移除任何数字,直接返回原字符串。
  • 在移除数字后,如果结果字符串开头为"0",则需移除多余的"0"。

实例演示

以"1432219"为例,移除2位数字:

  • 初始状态:栈为空。
  • 遍历"1":入栈。
  • 遍历"4":大于栈顶"1",弹出"1"。
  • 遍历"3":入栈。
  • 遍历"2":小于栈顶"3",不入栈。
  • 遍历"2":大于栈顶"3",弹出"3"。
  • 遍历"1":大于栈顶"2",弹出"2"。
  • 遍历"9":入栈。
  • 栈中剩余元素:"1"、"9"。
  • 将元素按出栈顺序拼接,得到结果:"19"。

代码实现(Python)

def remove_k_digits(num, k):
  """
  利用单调栈移除K位数字,得到尽可能小的结果。

  Args:
    num: 表示非负整数的字符串。
    k: 要移除的数字数量。

  Returns:
    移除K位数字后的结果字符串。
  """

  # 边界条件判断
  if len(num) <= k:
    return "0"

  # 创建单调递减栈
  stack = []

  # 遍历字符串
  for digit in num:
    # 若栈顶元素大于当前数字,则弹出栈顶元素
    while stack and stack[-1] > digit and k > 0:
      stack.pop()
      k -= 1

    # 将当前数字入栈
    stack.append(digit)

  # 处理栈中剩余元素
  result = "".join(stack)
  while result and result[0] == "0" and len(result) > 1:
    result = result[1:]

  # 返回结果
  return result or "0"

复杂度分析

  • 时间复杂度:O(n),其中n是字符串的长度。
  • 空间复杂度:O(n),用于存储单调栈。

总结

利用单调栈的数据结构,我们可以高效地解决LeetCode 402题。该算法具有较好的时间和空间复杂度,并且能够处理各种边界条件,是解决此类问题的有效方法。