滑动窗口优化

This commit is contained in:
yaha 2023-06-05 15:16:55 +08:00
parent e23d7c213b
commit 1d1c2577c9
5 changed files with 71 additions and 17 deletions

View File

@ -10,9 +10,9 @@ file(GLOB_RECURSE SOURCES "src/*/*.cpp")
add_library(${APP_LIB_NAME} ${SOURCES}) add_library(${APP_LIB_NAME} ${SOURCES})
include(cmake/googletest.cmake) include(cmake/googletest.cmake)
option(WITH_PROFILE OFF) #option(WITH_PROFILE OFF)
if (${WITH_PROFILE}) #if (${WITH_PROFILE})
add_definitions(-DENABLE_PROFILING) # add_definitions(-DENABLE_PROFILING)
include(cmake/gperftools.cmake) # include(cmake/gperftools.cmake)
endif () #endif ()
include(cmake/tests.cmake) include(cmake/tests.cmake)

View File

@ -3,14 +3,49 @@
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++) { // for (int i = 0; i < nums.size(); i++) {
int max_num = 0; // int max_num = nums[i];
if (k + i <= nums.size()) { // if (k + i <= nums.size()) {
for (int j = i; j < k + i; ++j) { // for (int j = i; j < k + i; ++j) {
std::cout << nums[j] << " " << std::endl; // max_num = std::max(max_num, nums[j]);
max_num = std::max(max_num, nums[j]); // }
} // ret.push_back(max_num);
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) {
// 保证滑动窗口的数量是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()]);
} }
} }

View File

@ -8,7 +8,7 @@ TEST(MinStackTest, BasicAssertions) {
min_stack.push(0); min_stack.push(0);
min_stack.push(-3); min_stack.push(-3);
ASSERT_EQ(-3, min_stack.min()); ASSERT_EQ(-3, min_stack.min());
ASSERT_EQ(-1, min_stack.top());
min_stack.pop(); min_stack.pop();
ASSERT_EQ(0, min_stack.top());
ASSERT_EQ(-2, min_stack.min()); ASSERT_EQ(-2, min_stack.min());
} }

View File

@ -8,7 +8,10 @@ TEST(NodeTest, TestCopyRandomList) {
head->next->next->next = new yaha::Node(4); head->next->next->next = new yaha::Node(4);
yaha::Node *copy = head->copy_random_list(head); 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 copy;
delete head; delete head;
} }

View File

@ -11,6 +11,22 @@ TEST(MaxSlidingWindowTest, NumbaerTest) {
std::vector<int> nums2 = {1, -1}; std::vector<int> nums2 = {1, -1};
std::vector<int> exp2 = {1, -1}; std::vector<int> exp2 = {1, -1};
res = yaha::max_sliding_window(nums, k); auto res2 = yaha::max_sliding_window(nums2, 1);
ASSERT_EQ(exp2, res); ASSERT_EQ(exp2, res2);
std::vector<int> nums3 = {7, 2, 4};
std::vector<int> exp3 = {7, 4};
auto res3 = yaha::max_sliding_window(nums3, 2);
ASSERT_EQ(exp3, res3);
std::vector<int> nums4 = {1, 3, 1, 2, 0, 5};
std::vector<int> exp4 = {3, 3, 2, 5};
auto res4 = yaha::max_sliding_window(nums4, 3);
ASSERT_EQ(exp4, res4);
std::vector<int> nums5 = {9, 10, 9, -7, -4, -8, 2, -6};
std::vector<int> exp5 = {10, 10, 9, 2};
auto res5 = yaha::max_sliding_window(nums5, 5);
ASSERT_EQ(exp5, res5);
} }