Merge branch 'main' of git.flyaha.top:yaha/leetcode

This commit is contained in:
yaha 2023-06-09 14:48:38 +08:00
commit 0c024b85fd
4 changed files with 73 additions and 26 deletions

View File

@ -2,6 +2,7 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <queue>
#include <stack> #include <stack>
namespace yaha { namespace yaha {
@ -123,6 +124,23 @@ private:
std::stack<int> _min_stk; 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. * Offer 59 - I.
* *

View 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;
}
}

View File

@ -3,32 +3,6 @@
namespace yaha { namespace yaha {
std::vector<int> max_sliding_window(std::vector<int> &nums, int k) { std::vector<int> max_sliding_window(std::vector<int> &nums, int k) {
std::vector<int> ret; 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; std::deque<int> d;
for (int i = 0; i < nums.size(); ++i) { for (int i = 0; i < nums.size(); ++i) {

View 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());
}