Deque-STL

Deque-STL

Double ended queue or Deque(part of C++ STL) are sequence containers with dynamic sizes that can be expanded or contracted on both ends (either its front or its back). The member functions of deque that are mainly used are:

· Deque Template:

· std::deque<value_type>

· Declaration:

· deque<int> mydeque; //Creates a double ended queue of deque of int type

· Size

· int length = mydeque.size(); //Gives the size of the deque

· Push

· mydeque.push_back(1); //Pushes element at the end

· mydeque.push_front(2); //Pushes element at the beginning

· Pop

· mydeque.pop_back(); //Pops element from the end

· mydeque.pop_front(); //Pops element from the beginning

· Empty

· mydeque.empty() //Returns a boolean value which tells whether the deque is empty or not

Given a set of arrays of size and an integer , you have to find the maximum integer for each and every contiguous subarray of size for each of the given arrays.

Input Format

First line of input will contain the number of test cases T. For each test case, you will be given the size of array N and the size of subarray to be used K. This will be followed by the elements of the array Ai.

Output Format

For each of the contiguous subarrays of size of each array, you have to print the maximum integer.

Sample Input

2

5 2

3 4 6 3 4

7 4

3 4 5 8 1 4 10

Sample Output

4 6 6 4

8 8 8 10

Explanation

For the first case, the contiguous subarrays of size 2 are {3,4},{4,6},{6,3} and {3,4}. The 4 maximum elements of subarray of size 2 are: 4 6 6 4.

For the second case,the contiguous subarrays of size 4 are {3,4,5,8},{4,5,8,1},{5,8,1,4} and {8,1,4,10}. The 4 maximum element of subarray of size 4 are: 8 8 8 10.

题意:T组数据,输入n个数,输出每k个数中最大的值。

 

#include <iostream>

#include <algorithm>

#include <deque>

using namespace std;

void printKMax(int arr[], int n, int k)

{

    deque<int> q;

    for(int i=0;i<k;i++)

    {

        while(!q.empty() && arr[i]>=arr[q.back()])

            //q.back()返回c容器最后一个元素

        {

            q.pop_back();

        //q.pop_back()删除末尾位置的元素

        }

        q.push_back(i);

        //q.push_back(num)在末尾位置插入元素

//这里保存的是最大元素的下标

    }

    for(int i=k;i<n;i++)

    {

        cout<<arr[q.front()]<<" ";

        //q.front()返回c容器的第一个元素

        while(!q.empty() && q.front()<=i-k)//要保证在k个数之中

        {

            q.pop_front();

            //q.pop_front()删除开头位置的元素

        }

        while(!q.empty() && arr[i]>=arr[q.back()])

        {

            q.pop_back();//还是保存最大元素的下标

        }

        q.push_back(i);

    }

    cout<<arr[q.front()]<<endl;

}

int main()

{

    int t;

    cin >> t;

    while(t>0)

    {

        int n,k;

        cin >> n >> k;

        int i;

        int arr[n];

        for(i=0;i<n;i++)

            cin >> arr[i];

        printKMax(arr, n, k);

        t--;

     }

     return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值