402. Remove K Digits
来源:互联网 发布:淘宝能买汽车吗 编辑:程序博客网 时间:2024/04/27 18:06
Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.
Note:
- The length of num is less than 10002 and will be ≥ k.
- The given num does not contain any leading zero.
Example 1:
Input: num = "1432219", k = 3Output: "1219"Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.
Example 2:
Input: num = "10200", k = 1Output: "200"Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.
Example 3:
Input: num = "10", k = 2Output: "0"Explanation: Remove all the digits from the number and it is left with nothing which is 0.
思路:怎样才能让结果最小呢?从前面开始,发现小的数字就应该把前面的数字替换掉,有个明显的出栈入栈的过程,于是乎用栈,那能确保怎样替换是正确的结果吗?仔细想想发现其实这就是greedy algorithm,是可以得到正确的结果的
/* * greedy algorithm using stack * 每一步都是到目前为止最优的结果(不管后面是什么)),谓之贪心 * 后一步的最优结果一定一前面的最优结果为基础 */public class Solution { public String removeKdigits(String num, int k) { if(num.length() == k)return "0"; Stack<Character> stack = new Stack<Character>(); char[] cs = num.toCharArray(); int cnt = k; for(char c : cs) { while(!stack.isEmpty() && stack.peek()>c && cnt>0) { stack.pop(); cnt --; } stack.push(c); } StringBuilder sb = new StringBuilder(); while(!stack.isEmpty())sb.append(stack.pop()); //delete 0 from end while(sb.length()>0 && sb.charAt(sb.length()-1) == '0') sb.deleteCharAt(sb.length()-1); int maxLen = Math.min(num.length()-k, sb.length());return sb.length()==0 ? "0" : sb.reverse().substring(0, maxLen).toString(); }}
二刷:
直观感觉贪心,策略是尽可能把小的数放到高位上,最佳的情况就是从左到右都是递增的,
但是如果不是呢?某一位比前面的数小,那我们可以肯定是要删除前面大的树,让这个更小的数往前面靠,
考虑到前面数是升序的,所以删除就是从后往前删,这不就是单调栈嘛
0 0
- 402. Remove K Digits
- 402. Remove K Digits
- 402.Remove K Digits
- 402. Remove K Digits
- 402. Remove K Digits
- 402. Remove K Digits
- 402. Remove K Digits
- 402. Remove K Digits
- 402. Remove K Digits
- 402. Remove K Digits
- 402. Remove K Digits
- 402. Remove K Digits
- 【Leetcode】402. Remove K Digits
- leetcode 402. Remove K Digits
- LeetCode 402. Remove K Digits
- [LeetCode]402. Remove K Digits
- 算法:402. Remove K Digits
- leetcode 402. Remove K Digits
- 在Vue中通过自定义指令获取元素
- Java学习篇之java的基本语法
- [51NOD]1283 最小周长[数学]
- UI设计学习路线图
- 这是一个简单的小东西——用html做Diy书签
- 402. Remove K Digits
- SEO唯有勤奋优化,新手必读!
- Python操作HBase
- Activity生命周期
- 乐观锁和悲观锁的区别
- iOS学习笔记-038.UITableView示例二——九宫格
- [JNI]开发实例(1)封装libjpeg库 保证图片质量压缩图片
- 论文Convolutional Naural Networks for Sentence Classification--模型介绍篇
- 非微信官方网页,继续访问将转换成手机预览模式