返回
Python中利用单调栈巧妙移除K位数字:LeetCode 402
后端
2023-10-12 06:54:37
在LeetCode 402题中,我们面临的挑战是给定一个表示非负整数的字符串,我们需要从中移除K位数字,得到一个尽可能小的结果。为了解决这个问题,我们可以巧妙地利用单调栈的数据结构。
单调栈简介
单调栈是一种特殊的栈,其中元素按特定顺序排列。单调栈的性质之一是,新元素在入栈时只会与栈顶元素比较。如果新元素满足单调性要求(例如,递增或递减),则将其入栈;否则,栈顶元素将被弹出。
应用单调栈解决402题
对于LeetCode 402题,我们可以使用一个递减单调栈。具体算法步骤如下:
- 从字符串开头遍历数字,将每个数字入栈。
- 如果栈顶数字大于当前数字,则弹出栈顶数字。
- 重复步骤2,直到栈为空或达到要移除的数字数量K。
- 将栈中剩余的数字按出栈顺序拼接起来,得到结果字符串。
边界条件处理
在应用单调栈算法时,需要考虑以下边界条件:
- 如果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题。该算法具有较好的时间和空间复杂度,并且能够处理各种边界条件,是解决此类问题的有效方法。