From 1d1c2577c9744d86007c46410ce3b6749d8a08e2 Mon Sep 17 00:00:00 2001 From: yaha <1143990204@qq.com> Date: Mon, 5 Jun 2023 15:16:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=BB=91=E5=8A=A8=E7=AA=97=E5=8F=A3=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 10 ++--- src/jianzhi_offer/number.cpp | 51 ++++++++++++++++++++++---- tests/jianzhi_offer/min_stack_test.cpp | 2 +- tests/jianzhi_offer/node_test.cpp | 5 ++- tests/jianzhi_offer/number_test.cpp | 20 +++++++++- 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2659bc9..6e87ac6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,9 +10,9 @@ file(GLOB_RECURSE SOURCES "src/*/*.cpp") add_library(${APP_LIB_NAME} ${SOURCES}) include(cmake/googletest.cmake) -option(WITH_PROFILE OFF) -if (${WITH_PROFILE}) - add_definitions(-DENABLE_PROFILING) - include(cmake/gperftools.cmake) -endif () +#option(WITH_PROFILE OFF) +#if (${WITH_PROFILE}) +# add_definitions(-DENABLE_PROFILING) +# include(cmake/gperftools.cmake) +#endif () include(cmake/tests.cmake) \ No newline at end of file diff --git a/src/jianzhi_offer/number.cpp b/src/jianzhi_offer/number.cpp index 9f8a3ab..c082d6a 100644 --- a/src/jianzhi_offer/number.cpp +++ b/src/jianzhi_offer/number.cpp @@ -3,14 +3,49 @@ 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 = 0; - if (k + i <= nums.size()) { - for (int j = i; j < k + i; ++j) { - std::cout << nums[j] << " " << std::endl; - max_num = std::max(max_num, nums[j]); - } - ret.push_back(max_num); +// 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) { + // 保证滑动窗口的数量是K,如果超过则从前面删除 + if (i >= k && d.front() <= i - k) { + d.pop_front(); + } + + // 保证后面进入的数据都是这个窗口里最大的,需要遍历整个队列,维护其最大值,这个需要从后面进行队列操作 + while (!d.empty() && nums[d.back()] <= nums[i]) { + d.pop_back(); + } + + d.push_back(i); + + if (i >= k - 1) { + ret.push_back(nums[d.front()]); } } diff --git a/tests/jianzhi_offer/min_stack_test.cpp b/tests/jianzhi_offer/min_stack_test.cpp index 6f61291..fb60c06 100644 --- a/tests/jianzhi_offer/min_stack_test.cpp +++ b/tests/jianzhi_offer/min_stack_test.cpp @@ -8,7 +8,7 @@ TEST(MinStackTest, BasicAssertions) { min_stack.push(0); min_stack.push(-3); ASSERT_EQ(-3, min_stack.min()); - ASSERT_EQ(-1, min_stack.top()); min_stack.pop(); + ASSERT_EQ(0, min_stack.top()); ASSERT_EQ(-2, min_stack.min()); } diff --git a/tests/jianzhi_offer/node_test.cpp b/tests/jianzhi_offer/node_test.cpp index 6783a0c..5ef1c1b 100644 --- a/tests/jianzhi_offer/node_test.cpp +++ b/tests/jianzhi_offer/node_test.cpp @@ -8,7 +8,10 @@ TEST(NodeTest, TestCopyRandomList) { head->next->next->next = new yaha::Node(4); yaha::Node *copy = head->copy_random_list(head); - ASSERT_EQ(copy->val, 4); + ASSERT_EQ(copy->val, 1); + ASSERT_EQ(copy->next->val, 2); + ASSERT_EQ(copy->next->next->val, 3); + ASSERT_EQ(copy->next->next->next->val, 4); delete copy; delete head; } \ No newline at end of file diff --git a/tests/jianzhi_offer/number_test.cpp b/tests/jianzhi_offer/number_test.cpp index 58c32e2..8fe095f 100644 --- a/tests/jianzhi_offer/number_test.cpp +++ b/tests/jianzhi_offer/number_test.cpp @@ -11,6 +11,22 @@ TEST(MaxSlidingWindowTest, NumbaerTest) { std::vector nums2 = {1, -1}; std::vector exp2 = {1, -1}; - res = yaha::max_sliding_window(nums, k); - ASSERT_EQ(exp2, res); + auto res2 = yaha::max_sliding_window(nums2, 1); + ASSERT_EQ(exp2, res2); + + std::vector nums3 = {7, 2, 4}; + std::vector exp3 = {7, 4}; + + auto res3 = yaha::max_sliding_window(nums3, 2); + ASSERT_EQ(exp3, res3); + + std::vector nums4 = {1, 3, 1, 2, 0, 5}; + std::vector exp4 = {3, 3, 2, 5}; + auto res4 = yaha::max_sliding_window(nums4, 3); + ASSERT_EQ(exp4, res4); + + std::vector nums5 = {9, 10, 9, -7, -4, -8, 2, -6}; + std::vector exp5 = {10, 10, 9, 2}; + auto res5 = yaha::max_sliding_window(nums5, 5); + ASSERT_EQ(exp5, res5); } \ No newline at end of file