题目:
给定一组序列和滑动窗口大小,找出滑动窗口中的最大值。例如,给定序列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);
}