【LC刷题】DAY10:150 239 347
150. 逆波兰表达式求值 link
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> stk;
int n = tokens.size();
for(int i = 0; i< n ; i++){
string &token = tokens[i];
if(isNumber(token)){
stk.push(atoi(token.c_str()));
}else{
int num2 = stk.top();
stk.pop();
int num1 = stk.top();
stk.pop();
switch(token[0]){
case '+':
stk.push(num1 + num2);
break;
case '-':
stk.push(num1 - num2);
break;
case '*':
stk.push(num1 * num2);
break;
case '/':
stk.push(num1 / num2);
break;
}
}
}
return stk.top();
}
bool isNumber(string &token){
return!(token == "+" || token == "-" || token == "*" || token == "/");
}
};
239. 滑动窗口最大值 link
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
priority_queue<pair<int, int>> q;
for(int i = 0; i < k; i++){
q.emplace(nums[i], i);
}
vector<int> ans = {q.top().first};
for(int i = k; i < n; i++){
q.emplace(nums[i], i);
while(q.top().second <= i - k){
q.pop();
}
ans.push_back(q.top().first);
}
return ans;
}
};
347. 前 K 个高频元素
class Solution {
public:
static bool cmp(pair<int, int>& m, pair<int, int>& n) {
return m.second > n.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> occurrences;
for (auto& v : nums) {
occurrences[v]++;
}
// pair 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);
for (auto& [num, count] : occurrences) {
if (q.size() == k) {
if (q.top().second < count) {
q.pop();
q.emplace(num, count);
}
} else {
q.emplace(num, count);
}
}
vector<int> ret;
while (!q.empty()) {
ret.emplace_back(q.top().first);
q.pop();
}
return ret;
}
};