生活随笔
收集整理的這篇文章主要介紹了
LeetCode 402. 移掉K位数字(贪心,单调栈)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
給定一個以字符串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。
注意:
num 的長度小于 10002 且 ≥ k。
num 不會包含任何前導零。
示例
1 :
輸入
: num
= "1432219", k
= 3
輸出
: "1219"
解釋
: 移除掉三個數字
4, 3, 和
2 形成一個新的最小的數字
1219。示例
2 :
輸入
: num
= "10200", k
= 1
輸出
: "200"
解釋
: 移掉首位的
1 剩下的數字為
200. 注意輸出不能有任何前導零。示例
3 :
輸入
: num
= "10", k
= 2
輸出
: "0"
解釋
: 從原數字移除所有的數字,剩余為空就是
0。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-k-digits
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 單調棧
class Solution {
public:string
removeKdigits(string num
, int k
) {if(k
==num
.size())return "0";char m
;int len
= num
.size()-k
, i
;string s
;for(i
= 0; i
< num
.size(); ++i
){m
= num
[i
];while(!s
.empty() && s
.back() > m
&& k
){s
.pop_back();k
--;}if(k
== 0)break;s
.push_back(m
);}if(k
== 0)s
= s
+ num
.substr(i
); while(s
.size() != len
)s
.pop_back();while(s
.size()>1 && s
[0]=='0')s
.erase(0,1);return s
;}
};
class Solution {
public:string
removeKdigits(string num
, int k
) {string ans
;for(int i
= 0; i
< num
.size(); ++i
){while(!ans
.empty() && ans
.back() > num
[i
] && k
> 0){ans
.pop_back();k
--;}ans
.push_back(num
[i
]);}while(k
--)ans
.pop_back();int i
= 0;while(i
< ans
.size() && ans
[i
] == '0')i
++;ans
= ans
.substr(i
);return ans
=="" ? "0" : ans
;}
};
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的LeetCode 402. 移掉K位数字(贪心,单调栈)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。