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

生成窗口最大值数组

作者: 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;
}

相关文章

  • 生成窗口最大值数组

    题目 有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。 例如,数组为【...

  • 生成窗口最大值数组

    题目 有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。 例如,数组为[...

  • 生成窗口最大值数组

    【题目】有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右滑动一个位置。例如,数组为[...

  • 生成窗口最大值数组

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

  • 生成窗口最大值

    题目: 生成窗口最大值数组有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边, 窗口每次向右边滑一个...

  • JZ-064-滑动窗口的最大值

    滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,...

  • 剑指Offer66题

    1、滑动窗口的最大值 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4...

  • 面试题59(剑指offer)--队列的最大值

    题目一: 滑动窗口的最大值。给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3...

  • 剑指Offer Java版 面试题59:队列的最大值

    题目一:滑动窗口的最大值。给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3...

  • 面试题59:队列的最大值

    题目 滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,...

网友评论

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

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