1.滑动窗口最大值(力扣)
构建一个递减的队列(广义上的) 对于新加入的元素,让它与队首相比较 如果比它大就让其出队 使队列保持广义的递增状态
(T.T 自己都没搞太明白 这个代码逻辑应该是没什么问题的 但是会超时 后面再改一改)
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
typedef struct{
int length;
int queue[10000];
}Myqueue;
void pop(Myqueue *obj)
{
for(int k=1;k<obj->length;k++)
{
obj->queue[k-1]=obj->queue[k];
}
obj->length--;
}
void push(Myqueue *obj,int m)
{
obj->queue[obj->length++]=m;
}
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize){
Myqueue *myqueue=(Myqueue*)malloc(sizeof(myqueue));
*returnSize=numsSize-k+1;
int *result=(int*)malloc(sizeof(int)*(numsSize-k+2));
int flag=0;
myqueue->length=0;
for(int i=0;i<=numsSize-k;i++)
{
if(myqueue->length==0)
{
push(myqueue,nums[i]);
}
else
{
while(nums[i]>myqueue->queue[0])
{
pop(myqueue);
}
push(myqueue,nums[i]);
if(i>=k&&nums[i-1]==myqueue->queue[0])
{
pop(myqueue);
}
}
if(i>=k-1)
{
result[flag++]=myqueue->queue[0];
}
}
return result;
}
2.前k个高频元素(力扣)
还是比较好想到 但是实现稍微有点麻烦
首先用map储存每个元素出现的次数
然后用优先级队列以小顶堆的方式构建起来
建立之后如果队列的规模比k大就不断让前面的元素出队列
直至规模==k 返回数组
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int>init_map;
for(auto &c:nums)
{
init_map[c]++;
}
struct compare{
bool operator()(pair<int,int>&p1,pair<int,int>&p2)
{
return p1.second>p2.second;
}
};
priority_queue<pair<int,int>,vector<pair<int,int>>,compare> q;
for(auto &a:init_map)
{
q.push(a);
if(q.size()>k){
q.pop();
}
}
vector<int>result;
while(!q.empty())
{
result.emplace_back(q.top().first);
q.pop();
}
return result;
}
};