代码随想录算法训练营第十三天 | 239. 滑动窗口最大值 347. 前 K 个高频元素
滑动窗口最大值
思路:
定义一个数据结构,包含pop,push,getmax。
其中pop()将deque结构的前端弹出(满足相应条件)
push()将数据push入deque中(满足其前面没有比其大的数据,若有将前面元素弹出(因为比其小的元素不可能成为最大值了))
getmax获取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 33 34 35 36 37 38 39 40 41 42
| class Solution { private: class MyQueue { public: deque<int> que; void pop(int value) { if (!que.empty() && value == que.front()) { que.pop_front(); } } void push(int value) { while (!que.empty() && value > que.back()) { que.pop_back(); } que.push_back(value);
} int front() { return que.front(); } }; 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.pop(nums[i - k]); que.push(nums[i]); result.push_back(que.front()); } return result; } };
|
删除字符串中的所有相邻重复项
思路:
将字符串push入栈中,如果遇到相同的则pop()。最后将栈中元素加入字符串中,最后将字符串反转。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: string removeDuplicates(string S) { stack<char> st; for (char s : S) { if (st.empty() || s != st.top()) { st.push(s); } else { st.pop(); } } string result = ""; while (!st.empty()) { result += st.top(); st.pop(); } reverse (result.begin(), result.end()); return result;
} };
|
逆波兰式求值
思路:
将字符串压入栈中,若遇到运算符号则进行运算,注意num2,nums1的运算顺序以及将字符串用stoll转换为长字符
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
| 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; } };
|
前 K 个高频元素
思路:
应用map将元素以及其出现的顺序存储,应用priority_queue<>函数将map中的元素呈小顶堆排序,最后逆序映入result中。
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;
} };
|