移掉K位数字
方法:单调栈
维护一个递增栈,但当前元素小于栈顶元素,则移掉栈顶元素。
思路
转自
作者:monkeybing 链接:https://leetcode-cn.com/problems/remove-k-digits/solution/cyu-yan-zhan-shi-xian-tan-xin-suan-fa-by-monkeybin/ 来源:力扣(LeetCode)
本题采用贪心思路:
- 如果字符串按照数字大小升序排列,只需要删除最后K个字符即可;
- 如果非升序排列,需要从前到后遍历,删除字符串中每个逆序排列的字符。由于是从前到后遍历,所以先删除的一定是高位的数字,可以保证删除后得到的最终数字最小。
举例来说:如果字符串num = "123456789", k = 3,我们只需要删除最后3个数字,得到"123456". 如果字符串num = "1432219", k = 3,需要从前到后遍历查找逆序数字,进行删除,第一个逆序数字为'4',第二个逆序数字为'3',第三个逆序数字为第二个'2',最后得到"1219"。
所以可以采用栈实现,每次遍历,判断如果栈非空,且当前数字大于栈顶数字,且k还有剩余(不为0),将栈顶数字出栈。最后将当前数字入栈。 如果遍历完成后,k仍有剩余,则依次将栈顶数字出栈。最后栈中保存的数字即为所求。按照从栈底到栈顶输出即可。 注意:特判场景,如果最后所有数字均出栈,即栈为空,需要返回"0"。
代码
1 | class Solution: |
复杂度
时间复杂度:O(n).
空间复杂度:O(n).