剑指offer之滑动窗口的最大值

举报
chenyu 发表于 2021/07/27 00:47:47 2021/07/27
【摘要】 1 问题 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值,列如,数组{2,3,4,2,6,2,5,1}的滑动窗口大小是3,一起6个滑动窗口,分别是{4,4,6,6,5}                 2 分析 2,3,4,2,6,2,5,1 我们这里可以用双端队列...

1 问题

给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值,列如,数组{2,3,4,2,6,2,5,1}的滑动窗口大小是3,一起6个滑动窗口,分别是{4,4,6,6,5}
 

 

 

 

 

 

 

 

2 分析

2,3,4,2,6,2,5,1
我们这里可以用双端队列,滑动窗口是3,我们先找出前3个数字里面的最大值,放在双端队列的头,然后依次向右滑动,确保每次滑动后队列的头是最大值。
 

 

 

 

 

 

 

 

3 代码实现


  
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4. using namespace std;
  5. vector<int> maxWindows(const vector<int> &nums, int size)
  6. {
  7. vector<int> maxWindows;
  8. if (size <= 0 || nums.size() <= 0 || (nums.size() < size))
  9. {
  10. return maxWindows;
  11. }
  12. deque<int> indexs;
  13. for (int i = 0; i < size; ++i)
  14. {
  15. while (indexs.size() > 0 && nums[i] > nums[indexs.back()])
  16. {
  17. indexs.pop_back();
  18. }
  19. indexs.push_back(i);
  20. }
  21. for (int i = size; i < nums.size(); ++i)
  22. {
  23. maxWindows.push_back(nums[indexs.front()]);
  24. while (indexs.size() > 0 && nums[i] > nums[indexs.back()])
  25. {
  26. indexs.pop_back();
  27. }
  28. while (indexs.size() > 0 && (i - indexs.front() >= size))
  29. {
  30. indexs.pop_front();
  31. }
  32. indexs.push_back(i);
  33. }
  34. maxWindows.push_back(nums[indexs.front()]);
  35. return maxWindows;
  36. }
  37. int main()
  38. {
  39. vector<int> nums;
  40. nums.push_back(2);
  41. nums.push_back(3);
  42. nums.push_back(4);
  43. nums.push_back(2);
  44. nums.push_back(6);
  45. nums.push_back(5);
  46. nums.push_back(2);
  47. nums.push_back(1);
  48. vector<int> result;
  49. result = maxWindows(nums, 3);
  50. if (result.size() > 0)
  51. {
  52. for (int i = 0; i < result.size(); ++i)
  53. std::cout << result[i] << std::endl;
  54. }
  55. return 0;
  56. }

 

 

 

 

 

4 运行结果


  
  1. 4
  2. 4
  3. 6
  4. 6
  5. 6
  6. 5

 

 

 

5 总结

在一个数组里面,通过双端队列(qedue)求最大值


  
  1. std::deque<int> indexs;
  2. std::vector<int> nums;
  3. nums.push_back(1);
  4. nums.push_back(3);
  5. nums.push_back(2);
  6. nums.push_back(5);
  7. nums.push_back(4);
  8. for (int i = 0; i < nums.size(); ++i)
  9. {
  10. while (indexs.size() > 0 && nums[i] > nums[indexs.back()])
  11. {
  12. indexs.pop_back();
  13. }
  14. indexs.push_back(i);
  15. }
  16. std::cout << "maxValue is " << nums[indexs.front()] << std::endl;

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/98341186

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。