LeetCode刷题笔记-数据结构-day14
Posted LL.LEBRON
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题笔记-数据结构-day14相关的知识,希望对你有一定的参考价值。
文章目录
LeetCode刷题笔记-数据结构-day14
155. 最小栈
1.题目描述
原题链接:155. 最小栈
2.解题思路
题目要求在常数时间内检索到最小元素。
我们这里使用两个栈:一个是基本的栈,一个是维护最小值的单调栈。
基本操作:
- 当我们向栈中压入一个数时,如果该数
≤
单调栈的栈顶元素或者单调栈为空,则将该数同时压入单调栈中;否则,不压入 - 当我们从基本栈弹出一个数时,判断该数是否等于单调栈栈顶元素,如果是也将单调栈栈顶元素弹出
- 每次获取最小元素就是单调栈的栈顶元素
3.代码
class MinStack
public:
stack<int> res,st;
MinStack()
void push(int val)
res.push(val);
if(!st.size()||st.top()>=val) st.push(val);
void pop()
if(st.size()&&res.top()==st.top()) st.pop();
res.pop();
int top()
return res.top();
int getMin()
return st.top();
;
1249. 移除无效的括号
1.题目描述
原题链接:1249. 移除无效的括号
2.解题思路
用一个栈存入(
的位置,用一个bool
数组标记哪些位置的括号是无效的。
从左遍历字符串:
- 如果是
(
则将其标记为true
,并将其下标加入栈 - 如果是
)
,检查栈中有木有(
:- 如果有说明当前两个括号匹配,将栈顶的
(
的标记改为false
,并且出栈。 - 如果栈为空,也就是不存在
(
与当前)
匹配,标记)
当前下标为true
- 如果有说明当前两个括号匹配,将栈顶的
- 最后遍历数组,只累加标记为
false
的字符
3.代码
class Solution
public:
string minRemoveToMakeValid(string s)
int n=s.size();
stack<int> st;
vector<bool> f(n+1,false);
for(int i=0;i<n;i++)
if(s[i]=='(')
st.push(i);
f[i]=true;
else if(s[i]==')')
if(st.size())
int t=st.top();
st.pop();
f[t]=false;
else
f[i]=true;
string res="";
for(int i=0;i<n;i++)
if(!f[i]) res+=s[i];
return res;
;
1823. 找出游戏的获胜者
1.题目描述
原题链接:1823. 找出游戏的获胜者
2.解题思路
用队列模拟即可。
每次队头出k-1个元素从队尾入,第k个元素直接出队,模拟n-1次,最后留在队列的元素就是获胜者。
3.代码
class Solution
public:
int findTheWinner(int n, int k)
queue<int> q;
for(int i=1;i<=n;i++) q.push(i);
for(int i=1;i<n;i++)
for(int j=1;j<k;j++)
int t=q.front();
q.pop();
q.push(t);
q.pop();
return q.front();
;
以上是关于LeetCode刷题笔记-数据结构-day14的主要内容,如果未能解决你的问题,请参考以下文章