内容:
说明:
找出子排队的最大值
示例代码:
// 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快