LeetCode239
自己写的超时代码(思路应该没错)
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
queue<int> hua;
int max = nums[0];
int maxpos = 0;
vector<int> plus;
for(int i = 0;i < k;i++)
{
hua.push(nums[i]);
if(nums[i] > max)
{
max = nums[i];
maxpos = i;
}
}
plus.push_back(max);
for(int j = k;j <nums.size();j++)
{
hua.push(nums[j]);
hua.pop();
if(j-k+1 <= maxpos && nums[j]<max)
{
plus.push_back(max);
continue;
}
else if(j-k+1 > maxpos)
{
max = nums[j-k+1];
maxpos = j-k+1;
for(int l = j-k+1;l <= j;l++)
{
if(nums[l] >= max)
{
max = nums[l];
maxpos = l;
}
}
}
else if(nums[j] >= max)
{
max = nums[j];
maxpos = j;
}
plus.push_back(max);
}
return plus;
}
};
Carl:利用单调队列
class Solution {
private:
class MyQueue{
public:
deque<int> que;
void pop(int value){
if(!que.empty()&&value == que.front())
{
que.pop_front();
}
}
void push(int value)
{
while(!que.empty() && value > que.back())
{
que.pop_back();
}
que.push_back(value);
}
int front()
{
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;
vector<int> result;
for (int i = 0; i < k; i++) { // 先将前k的元素放进队列
que.push(nums[i]);
}
result.push_back(que.front()); // result 记录前k的元素的最大值
for (int i = k; i < nums.size(); i++) {
que.pop(nums[i - k]); // 滑动窗口移除最前面元素
que.push(nums[i]); // 滑动窗口前加入最后面的元素
result.push_back(que.front()); // 记录对应的最大值
}
return result;
}
};
LeetCode347
Carl解法:(需要使用优先队列)
class Solution {
public:
class mycomparison{
public:
bool operator()(const pair<int,int> &a,const pair<int,int> &b){
return a.second > b.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> map;
for(int i = 0;i < nums.size();i++)
{
map[nums[i]]++;
}
priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparison> pri_que;
for(unordered_map<int, int>::iterator it = map.begin();it != map.end();it++)
{
pri_que.push(*it);
if(pri_que.size() > k){
pri_que.pop();
}
}
vector<int> result(k);
for(int i = 0;i < k;i++)
{
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};
感悟:注意学会单调队列和优先队列的使用