算法分析与设计第十六周
来源:互联网 发布:铝合金和塑钢知乎 编辑:程序博客网 时间:2024/06/06 20:18
分析:每次移除一个数,要尽可能使前面的数最小,因为前面的数的权值最大。而删除一个数,会导致后面紧接着的一个数代替删除的数的位置。所以在一次移除操作中,从前往后检查,一旦发现某个数后继的数更小,则删除此数。复杂度为o(k*n),可以采用递归的方法实现。(然而递归代码LeetCode显示内存超出,应该是栈溢出了,本地测试没问题。下面先给出递归代码,后面再给出迭代方法)
递归代码
class Solution {public: string removeKdigits(string num, int k) { if (k == 0) return num == "" ? "0" : num; if (num.length() == k) return "0"; if (num == "") return "0"; string next = ""; for (int i = 0; i < num.length() - 1;) { if (num[i + 1] >= num[i]) { next += num[i]; ++i; } else { ++i; while (i < num.length()) { next += num[i]; ++i; } // break; } } int i ; //消除前导0 for (i = 0; i < next.length() && next[i] == '0'; ++i); next = next.substr(i); return removeKdigits(next, k - 1); }};
迭代代码:
class Solution {public: string removeKdigits(string num, int k) { if (num.length() == k || num == "") return "0"; if (k == 0) return num; int len = num.length(); while (k-- > 0) { string next = ""; for (int i = 0; i < len - 1;) { if (num[i + 1] >= num[i]) { next += num[i]; ++i; } else { ++i; while (i < num.length()) { next += num[i]; ++i; } // break; } } int j ; for (j = 0; j < next.length() && next[j] == '0'; ++j); next = next.substr(j); len = next.length(); num = next; } return num == "" ? "0" : num; }};
通过截图
阅读全文
0 0
- 算法分析与设计第十六周
- 算法分析与设计第十六周:582. kill process
- 第十六周算法分析与设计:Generate Parentheses
- 算法设计与应用基础:第十六周
- 【算法分析与设计】【第十六周】期中小结(中)(未完)
- 算法设计与应用基础:第十六周(1)
- 算法设计与应用基础:第十六周(1)
- 算法设计与结构基础作业第十六周
- 算法分析与设计丨第十六周丨LeetCode(20)——Unique Paths II(Medium)
- 算法分析与设计
- 算法设计与分析
- 算法分析与设计
- 算法设计与分析
- 算法设计与分析
- 算法分析与设计
- 算法设计与分析
- 算法设计与分析
- 算法设计与分析
- plsql(二)--异常
- 输入一个单向链表,输出该链表中倒数第K个结点
- 使用wireshark进行安卓抓包分析
- 异常Java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind处理方法
- extension block
- 算法分析与设计第十六周
- Redis存储数据类型一:String
- plsql(二)--存储过程
- maven项目依赖本地jar文件
- 高级加密标准(AES)中的加密和解密
- Linux系统优化02
- Redis存储数据类型二:List
- Redis存储数据类型三:Set
- 2D画面中使物体跟随鼠标的方向旋转(向量法)