diff --git a/include/jianzhi_offer.h b/include/jianzhi_offer.h index 3c4af8e..8d0525e 100644 --- a/include/jianzhi_offer.h +++ b/include/jianzhi_offer.h @@ -2,6 +2,7 @@ #include #include +#include #include namespace yaha { @@ -115,6 +116,23 @@ private: std::stack _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 _que; + std::deque _max_queue; +}; + /** * 剑指 Offer 59 - I. 滑动窗口的最大值 * diff --git a/src/jianzhi_offer/max_queue.cpp b/src/jianzhi_offer/max_queue.cpp new file mode 100644 index 0000000..3bda4b5 --- /dev/null +++ b/src/jianzhi_offer/max_queue.cpp @@ -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; +} +} \ No newline at end of file diff --git a/src/jianzhi_offer/number.cpp b/src/jianzhi_offer/number.cpp index c082d6a..7ac1ab6 100644 --- a/src/jianzhi_offer/number.cpp +++ b/src/jianzhi_offer/number.cpp @@ -3,32 +3,6 @@ namespace yaha { std::vector max_sliding_window(std::vector &nums, int k) { std::vector 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 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 d; for (int i = 0; i < nums.size(); ++i) { diff --git a/tests/jianzhi_offer/max_queue_test.cpp b/tests/jianzhi_offer/max_queue_test.cpp new file mode 100644 index 0000000..8318333 --- /dev/null +++ b/tests/jianzhi_offer/max_queue_test.cpp @@ -0,0 +1,17 @@ +#include + +#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()); +}