滑动窗口优化

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})
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)

View File

@ -3,14 +3,49 @@
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 = 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<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(-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());
}

View File

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

View File

@ -11,6 +11,22 @@ TEST(MaxSlidingWindowTest, NumbaerTest) {
std::vector<int> nums2 = {1, -1};
std::vector<int> 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<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);
}