栈 以下题目主要是利用栈先进先出的特性
注意事项:
1、要确定栈非空才能访问栈顶元素,否则越界
思路:
用遍历区间的元素时,维护一个单调队列,从大到小排列。
要找到最大值,实际单调队列保存区间内最大值及最大值右侧的第二大值(用于当前最大值处于区间左端,在区间右移时更新临时最大值,只需要用临时最大值和新区间右端元素比较就可以知道新的最大元素)。为什么强调是最大值右侧的第二大值,因为最大值左侧的元素必然在最大值前离开区间。
特殊情况:
class Solution {
public:
bool isValid(string s) {
stack<char> cSt;
for(char c : s){
if(c == '(' || c == '{' || c == '['){
cSt.push(c);
}
else{
if(cSt.empty()) return false;
if((c == ')' && cSt.top() == '(') || (c == '}' && cSt.top() == '{') || (c == ']' && cSt.top() == '[')) {
cSt.pop();
}
else{
return false;
}
}
}
if(cSt.empty()) return true;
return false;
}
};
思路:
特殊情况:
class Solution {
public:
//自定义数据结构,重定义排序规则
class mycmp{
public:
bool operator()(const pair<int, int> &lfs, const pair<int, int> &rfs){
return lfs.second > rfs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
//用unordered_map 保存元素出现频率
unordered_map<int,int> Map;
for(int num : nums){
Map[num]++;
}
//使用优先队列的小顶堆 最小的元素最优先出队
priority_queue<pair<int,int>, vector<pair<int, int>>, mycmp> pri_que;
for(auto p : Map){
pri_que.push(p);
if(pri_que.size()>k) pri_que.pop();
}
vector<int> result(k);
for(int i = result.size()-1; i >= 0; i--){
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};