Day11 Leetcode刷题
LeetCode150.逆波兰表达式求值
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> s;
int result;
if(tokens.empty())
return 0;
else{
sscanf(tokens[0].c_str(),"%d",&result);
}
for(int i = 0; i < tokens.size(); i++){
if(tokens[i] == "*" || tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "/"){
int num1, num2;
num1 = s.top();
s.pop();
num2 = s.top();
s.pop();
if(tokens[i] == "*"){
result = num1 * num2;
}else if(tokens[i] == "+"){
result = num1 + num2;
}else if(tokens[i] == "-"){
result = num2 - num1;
}else{
result = num2 / num1;
}
s.push(result);
}else{
int num;
sscanf(tokens[i].c_str(),"%d",&num);
s.push(num);
}
}
return result;
}
};
需要注意的是:用sscanf将字符串转化为整形,然后第一个数字怎么处理。
LeetCode239.滑动窗口最大值
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
queue<int> q;
vector<int> result;
int size = 0;
for(int i = 0; i < k; i++){
q.push(nums[i]);
if(i > 0){
while(nums[i] > q.front()){
q.pop();
}
}
}
result.push_back(q.front());
for(int i = k; i < nums.size(); i++){
q.push(nums[i]);
while(nums[i] > q.front()){
q.pop();
}
result.push_back(q.front());
}
return result;
}
};
用一个单调队列,每次插入元素的时候,自己与队列最前面一个数比较,保证第一个数字比自己大,这样在每个滑动窗口中,队列的第一个数字就是最大值。
LeetCode347.前k个高频元素
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int times = 1;
std::vector<pair<int, int>> val_times;
std::vector<int> result;
for(int i = 0; i < nums.size(); i++){
if(i == nums.size() - 1 || nums[i] != nums[i + 1]){
std::pair<int, int> temp(nums[i], times);
val_times.push_back(temp);
times = 1;
}else{
times++;
}
}
sort(val_times.begin(),val_times.end(),[](const pair<int,int>& a, const pair<int,int>& b){
return a.second > b.second;
});
for(int i = 0; i < k; i++){
result.push_back(val_times[i].first);
}
return result;
}
};
计算每个元素出现的times,放在pair中,通过sort与lambda的组合根据times进行排序,最后取前k个值作为结果。需要牢记sort与lambda的组合写法。