lintcode 删除数字
2015-12-17 10:13
447 查看
lintcode 删除数字
给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。
找到删除 k 个数字之后的最小正整数。
N <= 240, k <= N
很普通的一个贪心法。
想选择一个前面对应位数的最小值,在之后这个值背后选择对应的最小值.
class Solution {
public:
string DeleteDigits(string A, int k) {
int ResultSize = A.size() - k;
if(ResultSize == 1)
return A;
int last = 0;//上一次的位置
char NowMin = 0;
string Result;
for(int i = 0; i != ResultSize; i++)
{
NowMin = '9'+1;
for(int j = last; j != k+i+1; j++)
{
if(A[j] < NowMin)
{
NowMin = A[j];
last = j + 1;
}
}
if(NowMin != '0' || Result.size()==0)
Result += NowMin;;
}
return Result;
}
};
不过我睡觉前想到了一个普遍的递归公式,利用动态规划解答。递归公式如下:
F(a,b)是数组A的区间[[a,b]的最小值的位置。
那么有F(a,b)= min(F(i,b-1),A[b]),其中F(i,b-1)表示从a,一直到b-1范围内的所有F[i,b-1]的最小值,这样我们就可以利用填矩阵的方式,求出最小值的区间了
不过这个方法在这里并不适用,相比于这个问题,这个解答的时间复杂度太大了
给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。
找到删除 k 个数字之后的最小正整数。
N <= 240, k <= N
很普通的一个贪心法。
想选择一个前面对应位数的最小值,在之后这个值背后选择对应的最小值.
class Solution {
public:
string DeleteDigits(string A, int k) {
int ResultSize = A.size() - k;
if(ResultSize == 1)
return A;
int last = 0;//上一次的位置
char NowMin = 0;
string Result;
for(int i = 0; i != ResultSize; i++)
{
NowMin = '9'+1;
for(int j = last; j != k+i+1; j++)
{
if(A[j] < NowMin)
{
NowMin = A[j];
last = j + 1;
}
}
if(NowMin != '0' || Result.size()==0)
Result += NowMin;;
}
return Result;
}
};
不过我睡觉前想到了一个普遍的递归公式,利用动态规划解答。递归公式如下:
F(a,b)是数组A的区间[[a,b]的最小值的位置。
那么有F(a,b)= min(F(i,b-1),A[b]),其中F(i,b-1)表示从a,一直到b-1范围内的所有F[i,b-1]的最小值,这样我们就可以利用填矩阵的方式,求出最小值的区间了
不过这个方法在这里并不适用,相比于这个问题,这个解答的时间复杂度太大了
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题