当前位置:网站首页>411-栈和队列(20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值、239. 滑动窗口最大值、347. 前 K 个高频元素)
411-栈和队列(20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值、239. 滑动窗口最大值、347. 前 K 个高频元素)
2022-06-24 09:33:00 【liufeng2023】
20. 有效的括号

class Solution {
public:
bool isValid(string s) {
stack<int> st;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(')
{
st.push(')');
}
else if (s[i] == '{')
{
st.push('}');
}
else if(s[i] == '[')
{
st.push(']');
}
else if (st.empty() || st.top() != s[i])
{
return false;
}
else
{
st.pop();
}
}
return st.empty();
}
};

1047. 删除字符串中的所有相邻重复项

class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for (char s1 : s)
{
if (st.empty() || st.top() != s1)
{
st.push(s1);
}
else
{
st.pop();
}
}
string result = "";
while (!st.empty())
{
result += st.top();
st.pop();
}
reverse(result.begin(), result.end());
return result;
}
};

150. 逆波兰表达式求值

class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for (int i = 0; i < tokens.size(); i++)
{
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")
{
int num1 = st.top();
st.pop();
int num2 = st.top();
st.pop();
if (tokens[i] == "+") st.push(num2 + num1);
if (tokens[i] == "-") st.push(num2 - num1);
if (tokens[i] == "*") st.push(num2 * num1);
if (tokens[i] == "/") st.push(num2 / num1);
}
else
{
st.push(stoi(tokens[i]));
}
}
int res = st.top();
st.pop();
return res;
}
};

239. 滑动窗口最大值

class Solution {
private:
class MyQueue {
//单调队列(从大到小)
public:
deque<int> que; // 使用deque来实现单调队列
// 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
// 同时pop之前判断队列当前是否为空。
void pop(int value) {
if (!que.empty() && value == que.front()) {
que.pop_front();
}
}
// 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
// 这样就保持了队列里的数值是单调从大到小的了。
void push(int value) {
while (!que.empty() && value > que.back()) {
que.pop_back();
}
que.push_back(value);
}
// 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
int front() {
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;
vector<int> result;
for (int i = 0; i < k; i++) {
// 先将前k的元素放进队列
que.push(nums[i]);
}
result.push_back(que.front()); // result 记录前k的元素的最大值
for (int i = k; i < nums.size(); i++) {
que.pop(nums[i - k]); // 滑动窗口移除最前面元素
que.push(nums[i]); // 滑动窗口前加入最后面的元素
result.push_back(que.front()); // 记录对应的最大值
}
return result;
}
};

347. 前 K 个高频元素

class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int,int> mp;
vector<int> res;
for(int num : nums)
{
mp[num]++;
}
vector<pair<int,int>> vmp;
for(auto it = mp.begin(); it != mp.end(); it++)
{
vmp.push_back({
it->first, it->second});
}
sort(vmp.begin(), vmp.end(),
[](const pair<int, int>& x, const pair<int,int>& y)->int{
return x.second > y.second;});
for(int i = 0; i < k; i++)
{
res.push_back(vmp[i].first);
}
return res;
}
};

边栏推荐
猜你喜欢
随机推荐
操作符详解
医学图像开源数据集汇总(二)
Symbol.iterator 迭代器
微信小程序学习之 实现列表渲染和条件渲染.
PostgreSQL DBA快速入门-通过源码编译安装
Geogebra instance clock
观察者模式
Five heart matchmaker
PHP file lock
二十、处理器调度(RR时间片轮转,MLFQ多级反馈队列,CFS完全公平调度器,优先级翻转;多处理器调度)
Operator details
队列Queue
impdp导schema报ORA-31625异常处理
Oracle查看数据文件头SCN信息
Amazing tips for using live chat to drive business sales
达梦数据库如何定位锁等待问题解决方法
字节跳动-面试官: 谈下音视频同步原理,音频和视频能绝对同步吗?
416-二叉树(前中后序遍历—迭代法)
Ora-28000 error after upgrading Oracle 12C to 19C
NLP-D59-nlp比赛D28—我想,也好—阶段总结—心态调整









