您的位置:首页 > 编程语言 > C语言/C++

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]的最小值,这样我们就可以利用填矩阵的方式,求出最小值的区间了

不过这个方法在这里并不适用,相比于这个问题,这个解答的时间复杂度太大了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 算法 lintcode