求滑动窗口最大值

题目:

给定一组序列和滑动窗口大小,找出滑动窗口中的最大值。例如,给定序列2,3,4,2,10,8,12和窗口大小3,滑动窗口最大值为 4,4,10,10,12.

分析:

  1. 暴力法:输入序列数为n,窗口大小为k。依次扫描滑动窗口求出其最大值,显然这种算法的时间在最坏的情况下时间复杂度为O(n*k).
  2. 如何把时间复杂度降到O(n),这就需每次要找出窗口中最大值的时间复杂度为O(1)。这种方法请参考剑指offer.
/* 滑动窗口的最大值
 * 时间复杂度O(nk), 为元素个数, k为窗口大小
 */
#include <iostream>
using namespace std;
int find_max(int a[], int p, int r)
{
    int max_index = 0;
    for(int i = p; i <= r; i++){
        if(a[max_index] < a[i])
            max_index = i;
    }
    return max_index;
}

void window(int a[], int n, int size)
{
    int max_index = 0;
    int *max = new int[n-size+1];
    int j = 0;

    max_index = find_max(a, 0, size-1);
    max[j++] = a[max_index];
    for(int i = size; i < n; i++){
        if(max_index > i-size && a[max_index] < a[i])
            max_index = i;
        if(max_index <= i-size)
            max_index = find_max(a, i-size+1 , i);

        max[j++] = a[max_index];
    }
    delete[] max;
}

int main()
{
    //int a[] = {2,3,4,2,6,2,5,1};
    int a[] = {2,11,4,10,6,2,5,1,100,99,10};
    window(a, sizeof(a)/sizeof(int), 3);
}

猜你喜欢

转载自blog.csdn.net/psc928624742/article/details/45023621
今日推荐