学习目标
加强堆栈的理解!
过程
239. 滑动窗口最大值
想了好久,想春一种方法,结果超时,看了答案,发现用单调队列。做的过程也发现了一些问题,主要是while((!deque_index.empty())&&(nums[i]>=nums[deque_index.back()])){
deque_index.pop_back();
先要判断是否为空!
class Solution {
public:
void deque_init(deque<int> &deque_index,vector<int>& nums, int start_index,int end_index){
//前面的不用管
for(int i=start_index;i<end_index;i++){
while((!deque_index.empty())&&(nums[i]>=nums[deque_index.back()])){
deque_index.pop_back();
}
deque_index.push_back(i);
}
}
void deque_add_max(deque<int> &deque_index,vector<int>& nums, int index){
while((!deque_index.empty())&&(nums[index]>nums[deque_index.back()])){
deque_index.pop_back();
}
deque_index.push_back(index);
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
//求出各个窗口的最大值,最大值需要记录下标,尽量需要
deque<int> deque_index;//保存最大值得索引 使用单调队列的方式
vector<int> return_vector ;
int size=nums.size();
if(k>size){
k=size;
}
deque_init(deque_index,nums,0,k);
return_vector.push_back(nums[deque_index.front()]);
for(int i=k;i<size;i++){
deque_add_max(deque_index,nums,i);
while((i-k)>=deque_index.front()){
deque_index.pop_front();
}
return_vector.push_back(nums[deque_index.front()]);
}
return return_vector;
}
};
347.前 K 个高频元素
想了很久,比较贴近原想法的,主要是哈希表的排序。建议用大顶推的方法。
class Solution {
public:
//升序排序
static int cmp(pair<int, int> a, pair<int, int> b){
return a.second > b.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
//排个序
unordered_map<int,int> map;
vector<int> res;
for(int n:nums){
map[n]++;
}
// 转为pair以对value进行排序
vector<pair<int, int>>v_pair;
for(auto it = map.begin(); it!=map.end(); it++){
v_pair.push_back(pair<int, int>(it->first, it->second));
}
sort(v_pair.begin(), v_pair.end(), cmp);
// 获取答案
for(int i = 0; i < k; i++){
res.push_back(v_pair[i].first);
}
return res;
}
};
结论
感觉挺难的,后续任重而道远!