剑指 Offer 59 - II. 队列的最大值
This commit is contained in:
parent
1d1c2577c9
commit
3338e98edf
@ -2,6 +2,7 @@
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <queue>
|
||||
#include <stack>
|
||||
|
||||
namespace yaha {
|
||||
@ -115,6 +116,23 @@ private:
|
||||
std::stack<int> _min_stk;
|
||||
};
|
||||
|
||||
/**
|
||||
* 剑指 Offer 59 - II. 队列的最大值
|
||||
*
|
||||
* @url: https://leetcode.cn/leetbook/read/illustration-of-algorithm/e2t5ug/
|
||||
*/
|
||||
class MaxQueue {
|
||||
public:
|
||||
MaxQueue() = default;
|
||||
int max();
|
||||
void push(int value);
|
||||
int pop();
|
||||
|
||||
private:
|
||||
std::queue<int> _que;
|
||||
std::deque<int> _max_queue;
|
||||
};
|
||||
|
||||
/**
|
||||
* 剑指 Offer 59 - I. 滑动窗口的最大值
|
||||
*
|
||||
|
||||
38
src/jianzhi_offer/max_queue.cpp
Normal file
38
src/jianzhi_offer/max_queue.cpp
Normal file
@ -0,0 +1,38 @@
|
||||
#include "jianzhi_offer.h"
|
||||
|
||||
namespace yaha {
|
||||
int MaxQueue::max() {
|
||||
// 弹出数据
|
||||
if (_max_queue.empty()) {
|
||||
return -1;
|
||||
}
|
||||
return _max_queue.front();
|
||||
}
|
||||
|
||||
void MaxQueue::push(int value) {
|
||||
// 维护普通队列,保证按照队列顺序写入值
|
||||
_que.push(value);
|
||||
|
||||
// 检查是否是按照顺序递减的方式在维护队列,如果是则直接写入,如果不是则依次弹出队列里的元素,直到队列里的最后元素是小于当前值
|
||||
while (!_max_queue.empty() && value > _max_queue.back()) {
|
||||
_max_queue.pop_back();
|
||||
}
|
||||
|
||||
// 此时已经保证双端队列里的值比当前value大了,然后写入数据
|
||||
_max_queue.push_back(value);
|
||||
}
|
||||
|
||||
int MaxQueue::pop() {
|
||||
if (_que.empty()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 如果双端队列里的值和队列里的值一样大,则需要将双端队里里的数据移出出来
|
||||
int val = _que.front();
|
||||
if (val == _max_queue.front()) {
|
||||
_max_queue.pop_front();
|
||||
}
|
||||
_que.pop();
|
||||
return val;
|
||||
}
|
||||
}
|
||||
@ -3,32 +3,6 @@
|
||||
namespace yaha {
|
||||
std::vector<int> max_sliding_window(std::vector<int> &nums, int k) {
|
||||
std::vector<int> ret;
|
||||
// for (int i = 0; i < nums.size(); i++) {
|
||||
// int max_num = nums[i];
|
||||
// if (k + i <= nums.size()) {
|
||||
// for (int j = i; j < k + i; ++j) {
|
||||
// max_num = std::max(max_num, nums[j]);
|
||||
// }
|
||||
// ret.push_back(max_num);
|
||||
// }
|
||||
// }
|
||||
|
||||
// if (nums.size() == 0 || k == 0) {
|
||||
// return ret;
|
||||
// }
|
||||
// std::deque<int> d;
|
||||
|
||||
// for (int j = 0, i = 1 - k; j < nums.size(); i++, j++) {
|
||||
// if (i > 0 && d.front() == nums[i - 1]) {
|
||||
// d.pop_front();
|
||||
// }
|
||||
// while (!d.empty() && d.back() < nums[j]) {
|
||||
// d.pop_back();
|
||||
// }
|
||||
// d.push_back(nums[j]);
|
||||
// if (i >= 0) ret.push_back(d.front());
|
||||
// }
|
||||
|
||||
|
||||
std::deque<int> d;
|
||||
for (int i = 0; i < nums.size(); ++i) {
|
||||
|
||||
17
tests/jianzhi_offer/max_queue_test.cpp
Normal file
17
tests/jianzhi_offer/max_queue_test.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "jianzhi_offer.h"
|
||||
|
||||
TEST(MaxQueueTest, BasicAssertions) {
|
||||
yaha::MaxQueue max_queue;
|
||||
max_queue.push(1);
|
||||
max_queue.push(2);
|
||||
ASSERT_EQ(2, max_queue.max());
|
||||
ASSERT_EQ(1, max_queue.pop());
|
||||
ASSERT_EQ(2, max_queue.max());
|
||||
|
||||
|
||||
yaha::MaxQueue max_queue2;
|
||||
ASSERT_EQ(-1, max_queue2.pop());
|
||||
ASSERT_EQ(-1, max_queue2.max());
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user