内容:
说明:
找出子排队的最大值
示例代码:
// Deque-STL.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <deque>
#include <iostream>
#include <algorithm>
using namespace std;
//timeout
void printKMax_Elment( int arr[], int n, int k )
{
for( int i = 0; i < n - k + 1; i++ )
{
//cout << *max_element(arr + i, arr + i + k);
printf( "%d ", *max_element( arr + i, arr + i + k ) );
}
}
//timeout
void printKMaxDequeue( int arr[], int n, int k )
{
for( int i = 0; i < n - k + 1; i++ )
{
deque<int> dq;
for( int j = i; j < k + i; j++ )
{
dq.push_back( arr[j] );
}
sort( dq.begin(), dq.end() );
cout << dq[dq.size() - 1] << " ";
}
}
//timeout
void printKMaxCompare( int arr[], int n, int k )
{
for( int i = 0; i < n - k + 1; i++ )
{
int max = arr[i];
for( int j = 1; j < k; j++ )
{
if( max < arr[i + j] )
max = arr[i + j];
}
printf( "%d ", max );
}
printf( "\n" );
}
void printKMax( int arr[], int n, int k )
{
deque<int> dq;
for( int i = 0; i < n; i++ )
{
// base case for first element
if( dq.empty() )
{
dq.push_back( i );
}
// remove elements outside the current window
if( dq.front() <= ( i - k ) )
{
dq.pop_front();
}
// move max element to the front
while( !dq.empty() && arr[i] >= arr[dq.back()] )
{
dq.pop_back();
}
dq.push_back( i );
// print out only when the first window is completed
if( i >= ( k - 1 ) )
{
cout << arr[dq.front()] << " ";
}
}
cout << endl;
}
//by zhaocl
int main()
{
int T;
cin >> T;
while( T-- )
{
int n, m;
cin >> n >> m;
int *arr = new int[n];
for( int i = 0; i < n; i++ )
{
cin >> arr[i];
}
printKMax( arr, n, m );
}
system( "pause" );
return 0;
}
知识点:
1、Dequeue的使用
2、题目容易实现,但是对于时间复杂度的问题比较难处理,很容易超时
3、针对2,有两处需要注意的地方:
3.1:用dequeue会比较快
3.2:printf scanf比cin cout快