Open In App

Print Minimum of all Subarrays using set in C++ STL

Improve
Improve
Like Article
Like
Save
Share
Report

Given an array of size N and an integer K, find the minimum for each and every contiguous subarray of size K.

Examples:

Input : arr[] = {5, 3, 4, 1, 1}, K = 3
Output : 3 1 1

Input : arr[] = {1, 2, 3, 4, 1, 6, 7, 8, 2, 1}, K = 4
Output : 1 1 1 1 1 2 1

Prerequisite:

Set performs insertion and removal operation in o(logK) time and always stores the keys in the sorted order.

The idea is to use a set of pairs where the first item in the pair is the element itself and the second item in the pair contains the array index of the element.

The following approach is being used in the program:

  1. Pick first k elements and create a set of pair with these element and their index as described above.
  2. Now, use window sliding technique and Loop from j=0 to n-k:
    • Get the minimum element from the set in the current window and print it.(The first element)
    • Search for the leftmost element of current window in the set and remove it.
    • Insert the next element of the current window in the set to move to next window.

Why do we use a set of pairs instead of a set?

A set doesn’t allow insertion of duplicate elements and a window of size k may have any number of duplicate elements. So, We insert a pair of the element and its index into the set.

Below is the implementation of the above approach:




// CPP program to print Minimum of
// all Subarrays using set in C++ STL
  
#include <bits/stdc++.h>
using namespace std;
  
// Function to print Minimum of
// all Subarrays using set in C++ STL
void minOfSubarrays(int arr[], int n, int k)
{
    // Create a set of pairs
    set<pair<int, int> > q;
  
    // Create an iterator to the set
    set<pair<int, int> >::iterator it;
  
    // Insert the first k elements along
    // with their indices into the set
    for (int i = 0; i < k; i++) {
        q.insert(pair<int, int>(arr[i], i));
    }
  
    for (int j = 0; j < n - k + 1; j++) {
  
        // Iterator to the beginning of the
        // set since it has the minimum value
        it = q.begin();
  
        // Print the minimum element
        // of current window
        cout << it->first << " ";
  
        // Delete arr[j](Leftmost element of
        // current window) from the set
        q.erase(pair<int, int>(arr[j], j));
  
        // Insert next element
        q.insert(pair<int, int>(arr[j + k], j + k));
    }
}
  
// Driver Code
int main()
{
    int arr[] = { 5, 3, 4, 1, 1 };
  
    int K = 3;
  
    int n = sizeof(arr) / sizeof(arr[0]);
  
    minOfSubarrays(arr, n, K);
  
    return 0;
}


Output:

3 1 1

Time Complexity: O(N * LogK)



Last Updated : 12 Nov, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads