lintcode 删除数字

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

不过这个方法在这里并不适用,相比于这个问题,这个解答的时间复杂度太大了




猜你喜欢

转载自blog.csdn.net/u011822516/article/details/50337853