Maximum of each subarray of length K

Given an array of integers and a number k, where 1 <= k <= length of the array, compute the maximum values of each subarray of length k.

Example:

Input: arr[]={10,5,2,7,8,7}, k=3
Output: 10 7 8 8 

Approach

C++

#include <bits/stdc++.h>
using namespace std;

//functiom to get the maximum value in the window
int getmax(stack<pair<intint>> &st1stack<pair<intint>> &st2)
{

    //if any stack is empty then return the top
    //elmemt of one which is non empty
    if (st1.empty() || st2.empty())
        return st1.empty() ? st2.top().second : st1.top().second;

    //else return the maximum of both the stacks
    return max(st1.top().secondst2.top().second);
}

//function to add new element
void add(stack<pair<intint>> &st1int new_element)
{

    //find the new maximum value if
    //stack is empty then maximum is the current element
    //else the maximum is max of cuurent element and top of stack
    int max1 = st1.empty() ? new_element :
 max(new_elementst1.top().second);

    //push into the stack with new max
    st1.push({new_elementmax1});
}

//function to remove the element
void remove(stack<pair<intint>> &st1
stack<pair<intint>> &st2)
{

    //if stack 2 is empty
    if (st2.empty())
    {

        //put all of stack one into stack 2
        //means convert into the queue
        while (!st1.empty())
        {
            int element = st1.top().first;
            st1.pop();
            int max1 = st2.empty() ? element : 
max(elementst2.top().second);
            st2.push({elementmax1});
        }
    }

    //delete the top element from stack 2
    st2.pop();
}

//function to find the maximum in window of
//given size
vector<intmaxSlidingWindow(vector<int&numsint k)
{
    stack<pair<intint>> st1st2;

    //add k elements
    for (int i = 0i < ki++)
        add(st1nums[i]);
    vector<intres;

    //push into the anwer
    res.push_back(getmax(st1st2));

    //inerate for remaining elements
    for (int i = ki < nums.size(); i++)
    {

        //remove the start element
        remove(st1st2);

        //add new elements
        add(st1nums[i]);

        //push into the result
        res.push_back(getmax(st1st2));
    }
    return res;
}

int main()
{
    vector<intarr = {1052787};
    int k = 3;
    vector<intmaximum = maxSlidingWindow(arrk);
    for (int i = 0i < maximum.size(); i++)
        cout << maximum[i] << " ";
    return 0;
}


No comments:

Post a Comment