1. 程式人生 > 實用技巧 >402. 移掉K位數字 leetcode

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 };