Leetcode150 逆波兰表达式
题目链接:逆波兰表达式
文章链接:代码随想录-逆波兰表达式
代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long > mystack;
for(int i = 0; i< tokens.size(); i++)
{
long long temp1,temp2;
if(tokens[i] == "+")
{
temp1 = mystack.top();
mystack.pop();
temp2 = mystack.top();
mystack.pop();
long long val = temp1 + temp2;
mystack.push(val);
}
else if(tokens[i] == "-")
{
temp1 = mystack.top();
mystack.pop();
temp2 = mystack.top();
mystack.pop();
long long val = temp2 - temp1;
mystack.push(val);
}
else if(tokens[i] == "*")
{
temp1 = mystack.top();
mystack.pop();
temp2 = mystack.top();
mystack.pop();
long long val = temp1 * temp2;
mystack.push(val);
}
else if(tokens[i] == "/")
{
temp1 = mystack.top();
mystack.pop();
temp2 = mystack.top();
mystack.pop();
long long val = temp2 / temp1;
mystack.push(val);
}
else
mystack.push(stoll(tokens[i]));
}
return mystack.top();
}
};
这次由于太急了,书写的风格及其不好,没有抽象剥离出单一操作,操作重复的太多了。
基础题,按照套路进行就行。
Leetcode239 滑动窗口的最大值
题目链接:滑动窗口的最大值
文章链接:代码随想录-滑动窗口的最大值
代码:
class Mydeque{
public:
deque<int> que;
void pop(int val)
{
if(!que.empty() && que.front() == val)
que.pop_front();
}
void push(int val, vector<int>& nums)
{
while(!que.empty() && nums[que.back()] <= nums[val])
que.pop_back();
que.push_back(val);
}
int front()
{
return que.front();
}
};
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Mydeque que;
vector<int> res;
for(int i = 0; i < k ; i++)
que.push(i,nums);
res.push_back(nums[que.front()]);
for(int i = k; i < nums.size(); i++)
{
que.pop(i-k);
que.push(i,nums);
res.push_back(nums[que.front()]);
}
return res;
}
};
使用单调队列即可,不过不是普通的单调队列。选择在front维护当前窗口的最大元素!!,push时,将back中小的元素pop掉,在pop窗口之外的元素时,要判断front中元素是否在窗口内,这只能使用下表来判断,所以下标也是重要指标。
Leetcode347 前k大频率的元素
题目链接:前k大频率的元素
文章链接:代码随想录-前K大频率元素
代码:
class Comparion{
public:
bool operator() (const pair<int,int>& l, const pair<int, int>& r){
return l.second > r.second;
}
};
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> res;
unordered_map<int,int> map;
for(int i = 0; i< nums.size(); i++)
map[nums[i]]++;
priority_queue<pair<int,int>, vector<pair<int, int>>, Comparion> que;
for(unordered_map<int, int>::iterator iter = map.begin(); iter != map.end(); iter++ )
{
que.push(*iter);
if(que.size() > k)
que.pop();
}
//vector<int> res;
for(int i = 0; i< k; i++)
{
res.push_back(que.top().first);
que.pop();
}
return res;
}
};
启发:对于C++高级编程与STL的基础熟悉度不够,淡忘太多,要重新熟悉。
这一题有个小trick,使用最小堆可以只建立一个大小为k的堆,不然最大堆要建立大小为n的堆!!