求滑動窗口最大值

題目:

給定一組序列和滑動窗口大小,找出滑動窗口中的最大值。例如,給定序列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);
}
發佈了50 篇原創文章 · 獲贊 16 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章