402. 移掉K位数字 leetcode

原题链接

根据题意,我们需要移除k位数字,并且让剩下的数最小,很明显光是找最大的数是没用的,我们需要找的是高位数且这位数字比下一位数字大,说明这一位数字移除就可以让剩下数字更小.但是也有可能出现移除位数不够的情况,此时的单调栈内是单调上升的序列,所以移除前面的数字只会让剩下的数字更大,所以我们要移除后面的数字

这里的易错点:

  1. 移除位数=字符串长度,此时剩下“0”而不是“”
  2. 此外,我们可以留下相同的数字,因为如果下一位更大,而位数又足够的情况,这样就会导致答案错误

代码:

 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]中选,以此类推,选数就是区间查询最小值.

posted @ 2020-12-29 13:50  acmloser  阅读(117)  评论(0编辑  收藏  举报