当前位置:   article > 正文

洛谷p1886(滑动窗口,单调队列)_洛谷滑动窗口队列queue

洛谷滑动窗口队列queue

这里简单来模拟一下:

1.开始front是0,rear是-1,两个while都不符合条件,执行rear++,此时,此时记下第一个元素的坐标0和值1

2.i++,变为1,第一个while不执行,因为第二个条件中的范围没有超出,再看第二个while,两个条件都符合,rear--,后++(此时rear变为0)。rear的下标变为1,值为3(想办法维护最大值在front的位置)
 3.i变为2,第一个while还是不执行,因为没有超出范围,第二个while也不执行,因为nums[i](此时是-1)小于maxQueue[rear].index(此时是3),然后rear++(变为1),rear的下标变为2,值变为-1,这时的i>=k-1(即已达到动画窗格的大小范围),输出front的值。此时的动画窗格中的元素排列是(3 -1),为什么1没有了呢,因为被我们弹出去了哈哈

4.以此类推...

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // Structure to represent a queue element
  4. struct QueueElement {
  5. int index;
  6. int value;
  7. };
  8. // Function to print the minimum values in each sliding window
  9. void printMinValues(const int nums[], int n, int k) {
  10. struct QueueElement* minQueue = (struct QueueElement*)malloc(n * sizeof(struct QueueElement));
  11. int front = 0, rear = -1;
  12. // Iterate through the array
  13. for (int i = 0; i < n; ++i) {
  14. // Remove elements that are out of the current window
  15. while (front <= rear && minQueue[front].index < i - k + 1) {
  16. front++;
  17. }
  18. // Remove elements that are smaller than the current element from the back of the queue
  19. while (front <= rear && nums[minQueue[rear].index] > nums[i]) {
  20. rear--;
  21. }
  22. // Add the current element to the queue
  23. rear++;
  24. minQueue[rear].index = i;
  25. minQueue[rear].value = nums[i];
  26. // Output the minimum value for each window
  27. if (i >= k - 1) {
  28. printf("%d ", minQueue[front].value);
  29. }
  30. }
  31. printf("\n");
  32. free(minQueue); // Free the dynamically allocated memory
  33. }
  34. // Function to print the maximum values in each sliding window
  35. void printMaxValues(const int nums[], int n, int k) {
  36. struct QueueElement* maxQueue = (struct QueueElement*)malloc(n * sizeof(struct QueueElement));
  37. int front = 0, rear = -1;
  38. for (int i = 0; i < n; ++i) {
  39. while (front <= rear && maxQueue[front].index < i - k + 1) {
  40. front++;
  41. }
  42. //非空的队列,且front的坐标超过了k所包含的范围
  43. while (front <= rear && nums[maxQueue[rear].index] < nums[i]) {
  44. rear--;
  45. }
  46. //将当前元素的索引 i 入队,因为它可能成为后面窗口中的最大值。
  47. rear++;
  48. maxQueue[rear].index = i;
  49. maxQueue[rear].value = nums[i];
  50. // Output the maximum value for each window
  51. //窗口形成的条件就是
  52. if (i >= k - 1) {
  53. printf("%d ", maxQueue[front].value);
  54. }
  55. }
  56. printf("\n");
  57. free(maxQueue); // Free the dynamically allocated memory
  58. }
  59. int main() {
  60. int n, k;
  61. scanf("%d %d", &n, &k);
  62. int* nums = (int*)malloc(n * sizeof(int));
  63. //数组给的比较大,所以用动态内存分配
  64. for (int i = 0; i < n; ++i) {
  65. scanf("%d", &nums[i]);
  66. }
  67. printMinValues(nums, n, k);
  68. printMaxValues(nums, n, k);
  69. free(nums); // Free the dynamically allocated memory
  70. return 0;
  71. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/993884
推荐阅读
相关标签
  

闽ICP备14008679号