2道题目
232. 滑动窗口最大值
347. 前 K 个高频元素
239
这道题比较难,暴力法好像会超时。看了题解也是一知半解,几乎没想到用单调队列来解决。
from collections import deque
class Deque:
def __init__(self):
self.deque = deque()
def pop(self, x):
if self.deque and x == self.deque[0]:
self.deque.popleft()
def push(self, x):
while self.deque and x > self.deque[-1]:
self.deque.pop()
self.deque.append(x)
def front(self):
return self.deque[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
deque = Deque()
res = []
for i in range(k):
deque.push(nums[i])
res.append(deque.front())
for i in range(k, len(nums)):
deque.pop(nums[i - k])
deque.push(nums[i])
res.append(deque.front())
return res
class Solution {
private:
class MyQue{
public:
deque<int> que;
void pop(int value){
if(!que.empty() && que.front() == value){
que.pop_front();
}
}
void push(int value){
while(!que.empty() && que.back() < value){
que.pop_back();
}
que.push_back(value);
}
int front(){
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQue que;
vector<int> res;
for(int i = 0; i < k; i ++){
que.push(nums[i]);
}
res.push_back(que.front());
for(int i = k; i < nums.size(); i ++){
que.pop(nums[i - k]);
que.push(nums[i]);
res.push_back(que.front());
}
return res;
}
};
python和C++代码都看了下,差别不是很大。
347
看了题目有想到用map记录频率然后暴力遍历取前k个元素。看了题解发现可以用优先级队列提高提取前k个的效率。
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
freqmap = {}
for i in range(len(nums)):
freqmap[nums[i]] = freqmap.get(nums[i], 0) + 1
smallheap = []
for key, value in freqmap.items():
heapq.heappush(smallheap, (value, key))
if len(smallheap) > k:
heapq.heappop(smallheap)
res = [0]*k
for i in range(k-1, -1, -1):
res[i] = heapq.heappop(smallheap)[1]
return res
class Solution {
public:
class MyCompare{
public:
bool operator()(const pair<int, int>& lhs, pair<int, int>& rhs){
return lhs.second > rhs.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>>, MyCompare> 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> res(k);
for(int i = k - 1; i >= 0; i --){
res[i] = pri_que.top().first;
pri_que.pop();
}
return res;
}
};