学习文章链接:代码随想录
一、150. 逆波兰表达式求值
题目链接:150. 逆波兰表达式求值
思路:使用栈
需要注意的点:注意栈是先进后出,要注意出栈时的运算顺序。要注意如何遍历栈中元素。c++类型转换。
方法1:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
int a,b,c;
for(int i=0;i<tokens.size();i++){
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
a=st.top();
st.pop();
b=st.top();
st.pop();
c=(tokens[i]=="+")?(a+b):(tokens[i]=="-")?(b-a):(tokens[i]=="*")?(a*b):(b/a);
st.push(c);
}
else{
st.push(stoi(tokens[i],0,10));
}
}
return st.top();
}
};
二、 239. 滑动窗口最大值
题目链接: 239. 滑动窗口最大值
思路:双向队列
需要注意的点:c++deque的用法,面向对象编程的规则
方法1:
class Solution {
private:
class Myque{
public:
deque<int> que;
void pop(int a){
if(!que.empty()&&a==que.front()){
que.pop_front();
}
}
void push(int a){
while(!que.empty()&&a>que.back()){
que.pop_back();
}
que.push_back(a);
}
int front(){
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Myque que;
vector<int> results;
for(int i=0;i<nums.size();i++){
if(i<k){
que.push(nums[i]);
if(i==k-1){
results.push_back(que.front());
}
}
else{
que.pop(nums[i-k]);
que.push(nums[i]);
results.push_back(que.front());
}
}
return results;
}
};
三、347.前 K 个高频元素
题目链接:347.前 K 个高频元素
思路:map统计元素出现频率,小顶堆留下k个频率最大的元素
需要注意的点:对堆的理解,map的表示,priority_queue的用法,如何遍历map和堆
C++ pair的基本用法总结(整理)
C++ | STL | 大顶堆 | 小顶堆 | std::priority_queue
C++ std::map几种遍历方式(正序、倒序)
方法1:
class Solution {
class compare{
public:
bool operator() (const pair<int,int>& x, const pair<int,int>& y){return x.second>y.second;}
};
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> fre;
for(int i=0;i<nums.size();i++){
fre[nums[i]]++;
}
priority_queue<pair<int,int>,vector<pair<int,int>>, compare> que;
for(unordered_map<int, int>::iterator iter=fre.begin();iter != fre.end();iter++){
que.push(*iter);
if(que.size()>k){
que.pop();
}
}
vector<int> results;
for(int i=0;i<k;i++){
results.push_back(que.top().first);
que.pop();
}
return results;
}
};