Hackerrank Deque-STL Solution
3 min read

Hackerrank Deque-STL Solution

Hackerrank Deque-STL Solution

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

To know more about deque, click here

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.

Constraints



, where  is the  element in the array .

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.

Solution in cpp

Approach 1.

#include <iostream>
#include <deque> 
using namespace std;
void printKMax(int arr[], int n, int k){
    deque<pair<int, int>> dq;
    for(int a=0; a<n; a++){
        while(!dq.empty() && a - dq.front().second >= k){
            dq.pop_front();
        }
        while(!dq.empty() && dq.back().first <= arr[a]){
            dq.pop_back();
        }
        dq.push_back({arr[a], a});
        if(a >= k - 1){
            cout << dq.front().first << " ";
        }
    }
    cout << "\n";
}
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;
}

Approach 2.

#include <iostream>
#include <deque> 
using namespace std;
void printKMax(int arr[], int n, int k){
    if (n == 0) {
        return;
    }
    
    if (n == 1 && k == 1) {
        cout << arr[1] << "\n";
    }
    
    deque<int> maxs;
    for(int i = 0; i < n; i++) {
        
        while(!maxs.empty() && arr[i] > arr[maxs.back()]) {
            maxs.pop_back();
        }
        maxs.push_back(i);
        
        while(!maxs.empty() && maxs.front() <= (i - k)) {
            maxs.pop_front();
        }

        if (i >= k-1) {
            cout << arr[maxs.front()] << " ";
        }
    }
    cout << "\n";
}

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;
}

Approach 3.

#include <iostream>
#include <deque> 
#include <algorithm>
using namespace std;
void printKMax(int arr[], int n, int k){
   //Write your code here.
deque<int> deq(k); int  i;
    for(i=0;i<k;i++)
        {
        while(!deq.empty()&&arr[i]>=arr[deq.back()])
            {
            deq.pop_back();
        }
        deq.push_back(i);   
    }
    for(i=k;i<n;i++)
        {
        cout<<arr[deq.front()]<<" ";
        while(!deq.empty() && deq.front()<=(i-k))
            {
                deq.pop_front();
            }
        while(!deq.empty()&&arr[i]>=arr[deq.back()])
            {
                deq.pop_back();
            }
        deq.push_back(i);
    }
    cout<<arr[deq.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);
      // printf("\n");
       t--;
     }
     return 0;
}

Enjoying these posts? Subscribe for more


Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

That's okay. But without advertising-income, we can't keep making this site awesome.

We don't have any banner, Flash, animation, obnoxious sound, or popup ad. We do not implement these annoying types of ads!

We need money to operate the site, and almost all of it comes from our online advertising.

Please add thepoorcoder.com to your ad blocking whitelist or disable your adblocking software.

×