题目大意
https://leetcode.com/problems/remove-k-digits/
给了你一个字符串代表非负整数,从其中去掉k位,使得剩下的字符串代表的整数最小并输出
题目分析
第一种我自己想的思路是:由于让整个数最小,那么应该从最高位开始保证每一位都尽可能的小,很自然地从左向右扫描字符串,得到结果的每一位,复杂度是O(n ^ 2)
第二种思路看了讨论区利用栈实现的O(n)算法(可以借助均摊分析,最多弹栈k次,压栈n次),思路是用一个辅助栈,然后扫描原串的每一位,在压入栈之前
先利用循环看栈顶的字符串是否比更大,如果大的话,就出栈,每次出栈,都代表remove了一位,因此出栈次数不能超过k,注意最后栈中的长度可能超过答案,只取前len(num) - k
个即可
代码
第一种思路
|
|
时间复杂度 O(n^2)
第二种思路
|
|
时间复杂度 O(n)