【739. 每日温度】
链接:https://leetcode.cn/problems/remove-duplicate-letters/description/
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> rec(n);
stack<int> s;
for (int i = 0; i < n; ++i) {
while (!s.empty() && temperatures[i] > temperatures[s.top()]) {
int tmp = s.top();
s.pop();
rec[tmp] = i - tmp;
}
s.push(i);
}
return rec;
}
};
【402. 移掉k位数字】
给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-k-digits/description/
class Solution {
public:
string removeKdigits(string num, int k) {
string tmp;
for (int i = 0; i < num.length(); ++i) {
while (!tmp.empty() && tmp.back() > num[i] && k) {
tmp.pop_back();
--k;
}
tmp.push_back(num[i]);
}
for (; k > 0; --k) {
tmp.pop_back();
}
bool isLeadingZero = true;
string res = "";
for (auto& digit: tmp) {
if (isLeadingZero && digit == '0') {
continue;
}
isLeadingZero = false;
res += digit;
}
return res == "" ? "0" : res;
}
};
【316. 去除重复字母】
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-duplicate-letters/description/
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int> cnts(26, 0); // 剩下的cnt
vector<bool> exists(26, false); // 是否在stack中
string ans = ""; // 作为stack
for(int i = 0; i < s.size(); i++) cnts[s[i] - 'a']++;
for(int i = 0; i < s.size(); i++) {
if (!exists[s[i] - 'a']) {
while (!ans.empty() && ans.back() > s[i] && cnts[ans.back() - 'a'] > 0) { // 剩下的cnt大于0,可以放心弹出
exists[ans.back() - 'a'] = false;
ans.pop_back();
}
ans.push_back(s[i]);
exists[s[i] - 'a'] = true;
}
cnts[s[i] - 'a']--;
}
return ans;
}
};