402.Remove K Digits¶
Tags: Medium
Greedy
Links: https://leetcode.com/problems/remove-k-digits/
Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.
Note:
- The length of num is less than 10002 and will be ≥ k.
- The given num does not contain any leading zero.
Example 1:
Input: num = "1432219", k = 3
Output: "1219"
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.
Example 2:
Input: num = "10200", k = 1
Output: "200"
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.
Example 3:
Input: num = "10", k = 2
Output: "0"
Explanation: Remove all the digits from the number and it is left with nothing which is 0.
class Solution {
public:
string removeKdigits(string num, int k) {
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
for (int i = 0; i < k; ++i) {
int n = num.size(), pre = 0;
bool hasFind = false;
string tmp;
for (int pos = pre + 1; pos < n; ++pos) {
if (num[pos] - '0' < num[pre] - '0') {
hasFind = true;
tmp = num.substr(0, pre) + num.substr(pos);
break;
}
else pre = pos;
}
if (hasFind) num = tmp;
else num = num.substr(0, n - 1);
}
int n = num.size(), pos = 0;
while (pos < n - 1 && num[pos] == '0') ++pos;
return n == 0 ? "0" : num.substr(pos);
}
};
属于贪心问题的删数问题,相关联的有:
- 洛谷-P1106 删数问题(一本通-1321:【例6.3】删数问题(Noip1994))
- 洛谷-P1323 删数问题