402. 移掉K位数字 leetcode
根据题意,我们需要移除k位数字,并且让剩下的数最小,很明显光是找最大的数是没用的,我们需要找的是高位数且这位数字比下一位数字大,说明这一位数字移除就可以让剩下数字更小.但是也有可能出现移除位数不够的情况,此时的单调栈内是单调上升的序列,所以移除前面的数字只会让剩下的数字更大,所以我们要移除后面的数字
这里的易错点:
- 移除位数=字符串长度,此时剩下“0”而不是“”
- 此外,我们可以留下相同的数字,因为如果下一位更大,而位数又足够的情况,这样就会导致答案错误
代码:
1 class Solution { 2 public: 3 string removeKdigits(string num, int k) { 4 stack<int> stk; 5 vector<int> v; 6 for(int i=0;i<num.size();i++){ 7 while(!stk.empty()&&num[stk.top()]>num[i]){ 8 v.push_back(stk.top()); 9 stk.pop(); 10 if(v.size()==k) break; 11 } 12 if(v.size()==k) break; 13 stk.push(i); 14 } 15 while(v.size()<k){ 16 int t = 1; 17 while(count(v.begin(),v.end(),num.size()-t)) t++; 18 v.push_back(num.size()-t); 19 } 20 string p; 21 for(int i=0;i<num.size();i++){ 22 if(count(v.begin(),v.end(),i)) continue; 23 p+=num[i]; 24 } 25 while(p[0]=='0'&&p.size()>1) p.erase(0,1); 26 if(p=="") p+='0'; 27 return p; 28 } 29 };
这里还有一个RMQ的做法.假设字符串长度为n,第一位一定在[1,n-m]中选,假设第1位在pos,那么第二位在[pos+1,n-m-1]中选,以此类推,选数就是区间查询最小值.