題目:
給定一組序列和滑動窗口大小,找出滑動窗口中的最大值。例如,給定序列2,3,4,2,10,8,12和窗口大小3,滑動窗口最大值爲 4,4,10,10,12.
分析:
- 暴力法:輸入序列數爲n,窗口大小爲k。依次掃描滑動窗口求出其最大值,顯然這種算法的時間在最壞的情況下時間複雜度爲O(n*k).
- 如何把時間複雜度降到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);
}