Leetcode 150 逆波兰表达式求值
本题的难点在于理解什么是波兰、逆波兰表达式,遍历字符串遍历到操作符则取出栈内的前两个数字进行运算,结果再压入栈中。由于遍历到的数字是字符的形式,所以需要先转化为int类型,可以通过stoll函数进行
st.push(stoll(tokens[i]));
int evalRPN(vector<string>& tokens) {
stack<long long>st;
for(int i=0;i<tokens.size();++i)
{
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
{
int b=st.top();
st.pop();
int a=st.top();
st.pop();
if(tokens[i]=="+")
{
int num=a+b;
st.push(num);
}
if(tokens[i]=="-")
{
int num=a-b;
st.push(num);
}
if(tokens[i]=="*")
{
int num=a*b;
st.push(num);
}
if(tokens[i]=="/")
{
int num=a/b;
st.push(num);
}
}
else st.push(stoll(tokens[i]));
}
int result=st.top();
st.pop();
return result;
}
Leetcode 239 滑动窗口最大值
该题如果是通过暴力来进行的话比较直观,但是如果采用线性时间复杂度来进行的话就有些困难,思考很久没有思路,看了解答才知道是没接触过的知识点。
通过deque实现一个单调队列
- pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
- push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止
class myQueue
{
public:
deque<int>que;
void pop(int value)
{
if(!que.empty()&&value==que.front())
{
que.pop_front();
}
}
void push(int value)
{
while(!que.empty()&&value>que.back())
{
que.pop_back();
}
que.push_back(value);
}
int front()
{
return que.front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
myQueue que;
vector<int>result;
for(int i=0;i<k;++i)
{
que.push(nums[i]);
}
result.push_back(que.front());
for(int i=k;i<nums.size();++i)
{
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.front());
}
return result;
}
Leetcode 347 前k个高频元素
没思路,大顶堆小顶堆也不太会,后面学了二叉树再回来做
浙公网安备 33010602011771号