150. 逆波兰表达式求值
题目链接
状态:错一次
错误原因:stoi不会使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public: int evalRPN(vector<string>& tokens) { stack<int> st; int a, b; for (int i = 0; i < tokens.size(); i++) { if (!st.empty() && (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")) { b = st.top(); st.pop(); if (st.empty()) return false; a = st.top(); st.pop(); if (tokens[i] == "+") st.push(a + b); else if (tokens[i] == "-") st.push(a - b); else if (tokens[i] == "*") st.push(a * b); else st.push(a / b); } else st.push(stoi(tokens[i])); } int ans=st.top(); return ans; } };
|
其实不用判断连续取两次会失败或栈为空的情况 (>_<)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public: 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] == "/") { long long num1 = st.top(); st.pop(); long long num2 = st.top(); st.pop(); if (tokens[i] == "+") st.push(num2 + num1); if (tokens[i] == "-") st.push(num2 - num1); if (tokens[i] == "*") st.push(num2 * num1); if (tokens[i] == "/") st.push(num2 / num1); } else { st.push(stoll(tokens[i])); } }
int result = st.top(); st.pop(); return result; } };
|
239. 滑动窗口最大值
题目链接
状态:超时
思路:暴力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public: int qmax(queue<int> q) { int max = q.front(); q.pop(); while (!q.empty()) { max = max > q.front() ? max : q.front(); q.pop(); } return max; } vector<int> maxSlidingWindow(vector<int>& nums, int k) { queue<int> q; int t = 0, tmp = 0; vector<int> ans; for (int i = 0; i <= nums.size(); i++) { if (t != k) { q.push(nums[i]); t++; } else { tmp = qmax(q); ans.push_back(tmp); if (i == nums.size()) break; q.pop(); q.push(nums[i]); } } return ans; } };
|
正确方法:单调队列!
整体结构:
1 2 3 4 5 6 7 8 9 10
| class MyQueue { public: void pop(int value) { } void push(int value) { } int front() { return que.front(); } };
|
设计单调队列的时候,pop,和push操作要保持如下规则:
- pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
- push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止
保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { private: class Myqueue { public: deque<int> que; void pop(int val) { if (!que.empty() && val == que.front()) que.pop_front(); } void push(int 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) { Myqueue que; vector<int> ans; for (int i = 0; i < k; i++) que.push(nums[i]); ans.push_back(que.front()); for (int i = k; i < nums.size(); i++) { que.pop(nums[i - k]); que.push(nums[i]); ans.push_back(que.front()); } return ans; } };
|
值得反复学习
347.前 K 个高频元素
题目链接
状态:想起来使用堆,但代码不会写,学习学习
思路:优先级队列!
1 2 3 4 5 6 7
| class mycomparison { public: bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) { return lhs.second > rhs.second; } };
|
参考代码!好好学
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public: class mycomparison { public: bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) { return lhs.second > rhs.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> result(k); for (int i = k - 1; i >= 0; i--) { result[i] = pri_que.top().first; pri_que.pop(); } return result;
} };
|
总结:优先队列
在 C++ 中, 是标准模板库(STL)的一部分,用于实现优先队列。
优先队列是一种特殊的队列,它允许我们快速访问队列中具有最高(或最低)优先级的元素。在 C++ 中,priority_queue 默认是一个最大堆,这意味着队列的顶部元素总是具有最大的值。
priority_queue 是一个容器适配器,它提供了对底层容器的堆操作。它不提供迭代器,也不支持随机访问。