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]的最小值,这样我们就可以利用填矩阵的方式,求出最小值的区间了
不过这个方法在这里并不适用,相比于这个问题,这个解答的时间复杂度太大了