Leetcode 150 逆波兰表达式
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> nums;
for(int i = 0; i < tokens.size(); i++){
if(tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/"){
nums.push( stoll(tokens[i]) );
}else{
long long a = nums.top();
nums.pop();
long long b = nums.top();
nums.pop();
if(tokens[i] == "+") {nums.push(b + a);}
if(tokens[i] == "-") {nums.push(b - a);}
if(tokens[i] == "*") {nums.push(b * a);}
if(tokens[i] == "/") {nums.push(b / a);}
}
}
return nums.top();
}
};
Leetcode 239 滑动窗口的最大值
用一个单调队列来存储所有可能的最大值,单调队列可以用双向队列deque来实现,要熟悉stack,queue,deque的操作。stack:push top pop size empty, queue: push pop front size, empty, deque: push_back push_front pop_back pop_front front back begin end empty size。另外,也不是很懂class private public这些。
class Solution {
public:
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.push(nums[i]);
que.pop(nums[i - k]);
result.push_back(que.front());
}
return result;
}
private:
class Myqueue {
public:
deque<int> que;
void push(int val) {
while (!que.empty() && val > que.back()) {
que.pop_back();
}
que.push_back(val);
}
void pop(int val) {
if (!que.empty() && val == que.front()) {
que.pop_front();
}
}
int front() { return que.front(); }
};
};
Leetcode 347 前k个高频元素
学习priority_queue的使用,包括声明,push pop top size empty,重载运算符和重写仿函数,大顶堆和小顶堆。学习迭代器和指针的区别,迭代器是一种对象,指针是一种变量。解引用操作符*用于获取指针所指对象的值,而箭头操作符用于访问指针所指对象的成员,通常用在结构体和类中,类似于先解引用再访问成员。
int *p; p = & i;等价于int *p = &i;
class Solution {
public:
class mycomparison{
public:
bool operator() (pair<int, int> a, pair<int, int> b){
return a.second > b.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
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>>, mycomparison> pri_que;
for(unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++){
pri_que.push(*it);
if(pri_que.size() > k) pri_que.pop();
}
vector<int> res(k);
for(int i = k - 1; i >= 0; i--){
res[i] = pri_que.top().first;
pri_que.pop();
}
return res;
}
};