239 难题 自己想的就算记下largest简化了 还是会在单调递减的nums情况时复杂度为O(n*k).
cr to 代码随想录:用deque队列(不是queue!因为deque可以加在front和back)
滑动时:
将nums[i]滑入窗口,即代码中加入队尾,此时先将它前面比他小的都pop_back走(因为比他小的且比他会先被滑走的留在队内无意义),再加入它。
将nums[i-k]滑出窗口,即代码中可能要pop_front,如果队头==nums[i-k](说明队头的就是要被滑走的),将其pop_front.
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> que;
for (int i=0; i<k; i++) {
while (!que.empty() && nums[i]>que.back()){
que.pop_back();
}
que.push_back(nums[i]);
}
vector<int> res;
res.push_back(que.front());
for (int i=k; i<nums.size(); i++) {
//要被移走的元素是 i-k
if (nums[i-k] == que.front()) {
que.pop_front();
}
while (!que.empty() && nums[i]>que.back()){
que.pop_back();
}
que.push_back(nums[i]);
res.push_back(que.front());
}
return res;
}
};
以下是deque
的一些主要成员函数:
push_back(element)
: 在deque的尾部添加一个元素push_front(element)
: 在deque的头部添加一个元素pop_back()
: 删除deque尾部的元素pop_front()
: 删除deque头部的元素size()
: 返回deque的大小(即包含的元素数量)empty()
: 如果deque为空,则返回trueoperator[]
: 返回对特定元素的引用,与数组的语义相同at(index)
: 与operator[]类似,但如果索引超出范围,会抛出out_of_range
异常clear()
: 删除deque的所有元素insert(iterator, element)
: 在指定的位置插入一个元素erase(iterator)
: 删除指定位置的元素
要注意的点:
1. pop_front/pop_back要想清楚了再写
2. pop的时候一定要检查que.empty()?不然会出错
347 思路不难 先放到map里面统计出现次数 再放入priority_queue里面 按照次数由大到小排序,最后将前k个放入vector
class Solution {
struct Compare{
bool operator() (const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second<rhs.second;
}
};
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> m;
for (int i=0; i<nums.size(); i++) {
m[nums[i]]++;
}
priority_queue<pair<int, int>, vector<pair<int,int>>, Compare> que;
for (pair<int, int> p: m) {
//cout<<"p is:"<<p.first<<", "<<p.second<<endl;
que.push(p);
}
vector<int> res;
while (k>0) {
res.push_back(que.top().first);
que.pop();
k--;
}
return res;
}
};
反思:这道题写的吭哧吭哧的,有几个原因:
1.不会写比较函数:(来自chatgpt)
比较函数需要接收两个参数,并返回一个 bool
值,表示第一个参数是否应该排在第二个参数之前。
模版如下:
struct Compare {
bool operator() (const DataType& lhs, const DataType& rhs) {
// 替换 < 为你需要的比较操作符
return lhs < rhs;
}
};
2.不会priority_queue,特别是加了比较函数的写法
比较函数其实是在定义什么样的 pair
应该被认为优先级较低,而 std::priority_queue
总是让优先级最高的元素先出队。
模版如下:
priority_queue<DataType, vector<DataType>, Compare> pq;