生成窗口最大值数组

2019-01-03  本文已影响0人  0x55aa

  第一种暴力查找算法,复杂度O(nm),利用双端队列可达到平均O(n)

#include <iostream>
#include <deque>
using namespace std;
//暴力查找 O(nm)
void getMaxWindow(int arr[], int n, int w,int* ret) {
       if (n < w || !ret)
              return;
       int rLen = n - w + 1;
       int* p = arr;
       for (int i = 0; i < rLen; ++i,++p) {
              int max = *p;
              for (int j = 1; j < w; ++j) {
                     if (max < *(p + j))
                           max = *(p + j);
              }
              *ret++ = max;
       }
}
//双端队列 O(n)
void getMaxWindowFast(int arr[], int n, int w, int* ret) {
       if (n < w || !ret)
              return;
       int rLen = n - w + 1;
       deque<int> dq;//存储的是元素的Index
       unsigned int it = 0;
       for (int i = 0; i < n; ++i) {
              while (!dq.empty() && arr[*(dq.end() - 1)] < arr[i])
                     dq.pop_back();//从队尾开始比较,把凡是小于当前值的所有元素都去掉
              dq.push_back(i);//将当前值加入队尾,即如果dq的len不是1,那么当前值就成了最小值
              if (!dq.empty() && dq.front() == i - w)
                     dq.pop_front();//顶部的值已经不再属于当前窗口
              if (i >= w - 1) {//窗口还没开始滑动之前,只有一个ret,开始滑动之后,每一次循环就有一个最大值
                     ret[it++] = arr[dq.front()];
              }
       }
}
int main() {
       int arr[] = { 4,3,5,4,3,3,6,7 };
       int w = 3;
       int* ret = new int[8 - w + 1];
       getMaxWindowFast(arr, 8, w, ret);
       for (int i = 0; i < 8 - w + 1; ++i) {
              cout << ret[i] << endl;
       }
       delete[] ret;
       system("pause");
       return 0;
}
上一篇下一篇

猜你喜欢

热点阅读