滑动窗口优化
This commit is contained in:
parent
e23d7c213b
commit
1d1c2577c9
@ -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)
|
||||
@ -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()]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user