美文网首页
生成窗口最大值数组

生成窗口最大值数组

作者: 0x55aa | 来源:发表于2019-01-03 16:00 被阅读0次

      第一种暴力查找算法,复杂度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;
    }
    

    相关文章

      网友评论

          本文标题:生成窗口最大值数组

          本文链接:https://www.haomeiwen.com/subject/apzfrqtx.html