150.逆波兰表达式求值
stoll()函数,将字符串转为长整型long long
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for(int i=0;i<tokens.size();i++)
{
if(tokens[i]=="+")
{
int a=st.top();
st.pop();
int b=st.top();
st.pop();
st.push(a+b);
}
else if(tokens[i]=="-")
{
int a=st.top();
st.pop();
int b=st.top();
st.pop();
st.push(b-a);
}
else if(tokens[i]=="*")
{
int a=st.top();
st.pop();
int b=st.top();
st.pop();
st.push(a*b);
}
else if(tokens[i]=="/")
{
int a=st.top();
st.pop();
int b=st.top();
st.pop();
st.push(b/a);
}
else
st.push(stoll(tokens[i]));
}
return st.top();
}
};
239.滑动窗口最大值
利用双向队列deque,实现单调队列
class Solution {
private:
class Myque{
public:
deque<int> que;//双向队列,可从前后弹出
void pop(int val){
if(!que.empty()&&val==que.front())//在push过程中已经pop()了部分元素,所以只有当滑动窗口中需要pop的元素与队列中头元素相等时才进行pop操作
que.pop_front();
}
void push(int val){
//当进行push操作时,为了保证滑动窗口的头部为最大值,在输入val时,从后往前把队列中比val小的数值都pop,再将val加入队列
while(!que.empty()&&val>que.back())
que.pop_back();
que.push_back(val);
}
int front(){
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Myque que;
vector<int> res;
for(int i=0;i<k;i++)
{
que.push(nums[i]);
}
res.push_back(que.front());
for(int i=k;i<nums.size();i++)
{
que.pop(nums[i-k]);
que.push(nums[i]);
res.push_back(que.front());
}
return res;
}
};
347.前k个高频元素
注意:bool operator()(){ }
class Solution {
public:
class compare{
public:
bool operator()(const pair<int,int>&l,const pair<int,int>&r){
return l.second>r.second;
}
};//构造小根堆的判断
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int>map;
for(auto i:nums)
{
map[i]++;
}//用map记录每个数出现的频率
priority_queue<pair<int,int>,vector<pair<int,int>>,compare>pri_que;//构造小根堆,pair<int,int>表示数据类型
for (auto &it:map) {
pri_que.push(it);
if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
pri_que.pop();
}
}
vector<int>res(k);//由于下面循环中用了res[i],需要初始化数组大小
for(int i=k-1;i>=0;i--)
{
res[i]=pri_que.top().first;
pri_que.pop();
}
return res;
}
};

被折叠的 条评论
为什么被折叠?



