题目1:239. 滑动窗口最大值 - 力扣(LeetCode)
啥也别说上来就是暴力解法,暴力解法提交查出时间限制(时间复杂度O(k*n)),但是可以过一些用例,代码附下:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> reslut;
for(int i = 0; i <= nums.size() - k;i++) {
int max = nums[i]; // 这里最开始写的 max = 0 这样负数会出现问题
for(int j = i; j < i + k;j++) {
if(nums[j] > max) max = nums[j];
}
reslut.push_back(max);
}
return reslut;
}
};
代码随想录的解法是自己构建一个单调的队列,让滑动窗口里的最大值保持在队列头,然后pop的时候,如果队列头就是数组里原来的元素,就pop掉这个元素,如果不是证明该滑动窗口再添加元素的时候已经把数组里的元素删掉了(因为要保持最大值,队列里只维护单调递减的数)。push函数进行时,会先判断要添加的元素是不是比队列末尾值大,如果大就pop_back 这个队里尾值,直到队尾值大于该元素,这里有可能出现空集合的情况,所以要判断是否为空,但是pop的时候,其实每个队列最起码得保留一个最大的值,所以队列肯定不为空。这里类就构建完了,然后后面的思路就是先把k个元素放进队列(这里用的是deque 双向队列,和普通的queue不一样),然后开始开始滑动,pop头元素,push新的元素进入队列,然后返回头元素就是最大的值。
题目2:347. 前 K 个高频元素 - 力扣(LeetCode)
这道题我想用map来存数组元素和它的个数,然后用一个二维vector 存map然后根据个数 排序,然后取前k个,但是用例超时了,代码附下:(应该没有逻辑错误, 用sort可以通过,对于二维数组,如果不进行指定默认根据第一列进行排序)
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int> _map;
vector<int> reslut;
vector<vector<int>> arr(nums.size(), vector<int>(2, 0));
for(int i = 0;i < nums.size();i++) {
auto iter = _map.find(nums[i]);
if(iter != _map.end()) {
iter->second++;
}else {
_map.insert(pair<int ,int>(nums[i], 1));
}
}
int i = 0;
for(auto it : _map) {
arr[i][0] = it.first;
arr[i][1] = it.second;
i++;
}
for(int i = 0;i < arr.size() - 1;i++) {
for(int j = 0;j < arr.size() - i - 1;j++) {
if(arr[j][1] > arr[j + 1][1]) swap(arr[j], arr[j + 1]);
}
}
for(int i = 0;i < k;i++) {
reslut.push_back(arr[arr.size() - i - 1][0]);
}
return reslut;
}
};
什么是堆呢?
堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。大顶堆pop的时候是弹出最大的元素,小顶堆相反。
优先级队列:priority_queue<Type, Container, Functional>
这道题感觉用map记录元素和其次数可以,但是后边的堆的定义是个难点。
class Solution {
public:
class cmp {
public:
bool operator()(const pair<int, int>& lhs, const 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>>, cmp> pr_qu;
for(auto it:map) {
pr_qu.push(it);
if(pr_qu.size() > k) {
pr_qu.pop();
}
}
vector<int> rel;
for(int i = 0;i < k;i++) {
rel.push_back(pr_qu.top().first);
pr_qu.pop();
}
return rel;
}
};
C++ | priority_queue的用法(含自定义排序方式) - 山竹小果 - 博客园 (cnblogs.com)
unordered_map学习之迭代器操作begin,cbegin(C++11),end,cend(C++11)_unordered_map begin和cbegin-优快云博客
本文介绍了如何使用暴力解法解决LeetCode中的滑动窗口最大值问题,以及通过单调队列和堆优化求解前K个高频元素的问题,包括C++实现的优先级队列和unordered_map的使用技巧。
1954

被折叠的 条评论
为什么被折叠?



