【每日Leetcode】单调栈系列(二)

文摘   2024-07-02 15:03   上海  

【739. 每日温度】

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
来源:力扣(LeetCode)

链接: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; }};

Arrietty刷题日记
清华计算机系学霸带你刷Leetcode(求职面试/保研考研/转计算机行业...)