Open In App

Smallest subarray containing minimum and maximum values

Last Updated : 12 Sep, 2022
Comments
Improve
Suggest changes
Like Article
Like
Report

Given an array A of size N. The task is to find the length of smallest subarray which contains both maximum and minimum values.

Examples: 

Input : A[] = {1, 5, 9, 7, 1, 9, 4}
Output : 2
subarray {1, 9} has both maximum and minimum value.

Input : A[] = {2, 2, 2, 2}
Output : 1
2 is both maximum and minimum here.

Approach: The idea is to use two-pointer technique here : 

  • Find the maximum and minimum values of the array.
  • Traverse through the array and store the last occurrences of maximum and minimum values.
  • If the of last occurrence of maximum is pos_max and minimum is pos_min, then the minimum value of abs(pos_min - pos_max) + 1 is our required answer.

Below is the implementation of the above approach:

C++
// C++ implementation of above approach

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

// Function to return length of
// smallest subarray containing both
// maximum and minimum value
int minSubarray(int A[], int n)
{

    // find maximum and minimum
    // values in the array
    int minValue = *min_element(A, A + n);
    int maxValue = *max_element(A, A + n);

    int pos_min = -1, pos_max = -1, ans = INT_MAX;

    // iterate over the array and set answer
    // to smallest difference between position
    // of maximum and position of minimum value
    for (int i = 0; i < n; i++) {

        // last occurrence of minValue
        if (A[i] == minValue)
            pos_min = i;

        // last occurrence of maxValue
        if (A[i] == maxValue)
            pos_max = i;

        if (pos_max != -1 and pos_min != -1)
            ans = min(ans, abs(pos_min - pos_max) + 1);
    }

    return ans;
}

// Driver code
int main()
{
    int A[] = { 1, 5, 9, 7, 1, 9, 4 };
    int n = sizeof(A) / sizeof(A[0]);

    cout << minSubarray(A, n);

    return 0;
}
Java
// Java implementation of above approach
import java.util.*;

class GFG
{

// Function to return length of
// smallest subarray containing both
// maximum and minimum value
static int minSubarray(int A[], int n)
{

    // find maximum and minimum
    // values in the array
    int minValue = A[0];
    for(int i = 1; i < n; i++)
    {
        if(A[i] < minValue)
            minValue = A[i];
    }
    int maxValue = A[0];
    for(int i = 1; i < n; i++)
    {
        if(A[i] > maxValue)
            maxValue = A[i];
    }

    int pos_min = -1, pos_max = -1, 
        ans = Integer.MAX_VALUE;

    // iterate over the array and set answer
    // to smallest difference between position
    // of maximum and position of minimum value
    for (int i = 0; i < n; i++) 
    {

        // last occurrence of minValue
        if (A[i] == minValue)
            pos_min = i;

        // last occurrence of maxValue
        if (A[i] == maxValue)
            pos_max = i;

        if (pos_max != -1 && pos_min != -1)
            ans = Math.min(ans, 
                  Math.abs(pos_min - pos_max) + 1);
    }

    return ans;
}

// Driver code
public static void main(String args[])
{
    int A[] = { 1, 5, 9, 7, 1, 9, 4 };
    int n = A.length;

    System.out.println(minSubarray(A, n));
}
}

// This code is contributed by
// Surendra_Gangwar
Python3
# Python3 implementation of above approach
import sys

# Function to return length of smallest 
# subarray containing both maximum and 
# minimum value
def minSubarray(A, n):

    # find maximum and minimum
    # values in the array
    minValue = min(A)
    maxValue = max(A)

    pos_min, pos_max, ans = -1, -1, sys.maxsize

    # iterate over the array and set answer
    # to smallest difference between position
    # of maximum and position of minimum value
    for i in range(0, n):
        
        # last occurrence of minValue
        if A[i] == minValue:
            pos_min = i

        # last occurrence of maxValue
        if A[i] == maxValue:
            pos_max = i

        if pos_max != -1 and pos_min != -1 :
            ans = min(ans, abs(pos_min - pos_max) + 1)

    return ans

# Driver code
A = [ 1, 5, 9, 7, 1, 9, 4 ]
n = len(A)

print(minSubarray(A, n))

# This code is contributed
# by Saurabh_Shukla
C#
// C# implementation of above approach
using System;
using System.Linq;

public class GFG{
    


// Function to return length of
// smallest subarray containing both
// maximum and minimum value
static int minSubarray(int []A, int n)
{

    // find maximum and minimum
    // values in the array
    int minValue = A.Min();
    int maxValue = A.Max();

    int pos_min = -1, pos_max = -1, ans = int.MaxValue;

    // iterate over the array and set answer
    // to smallest difference between position
    // of maximum and position of minimum value
    for (int i = 0; i < n; i++) {

        // last occurrence of minValue
        if (A[i] == minValue)
            pos_min = i;

        // last occurrence of maxValue
        if (A[i] == maxValue)
            pos_max = i;

        if (pos_max != -1 && pos_min != -1)
            ans = Math.Min(ans, Math.Abs(pos_min - pos_max) + 1);
    }

    return ans;
}

// Driver code


    static public void Main (){
            int []A = { 1, 5, 9, 7, 1, 9, 4 };
    int n = A.Length;

    Console.WriteLine(minSubarray(A, n));
    }
}
// This code is contributed by anuj_67..
PHP
<?php
// PHP implementation of above approach 

// Function to return length of 
// smallest subarray containing both 
// maximum and minimum value 
function minSubarray($A, $n) 
{ 

    // find maximum and minimum 
    // values in the array 
    $minValue = min($A);
    $maxValue = max($A);

    $pos_min = -1;
    $pos_max = -1;
    $ans = PHP_INT_MAX;

    // iterate over the array and set answer 
    // to smallest difference between position 
    // of maximum and position of minimum value 
    for ($i = 0; $i < $n; $i++)
    { 

        // last occurrence of minValue 
        if ($A[$i] == $minValue) 
            $pos_min = $i; 

        // last occurrence of maxValue 
        if ($A[$i] == $maxValue) 
            $pos_max = $i; 

        if ($pos_max != -1 and $pos_min != -1) 
            $ans = min($ans, abs($pos_min - 
                                 $pos_max) + 1); 
    } 

    return $ans; 
} 

// Driver code 
$A = array(1, 5, 9, 7, 1, 9, 4);
$n = sizeof($A);

echo minSubarray($A, $n); 

// This code is contributed by Ryuga
?>
JavaScript
<script>
    // Javascript implementation of above approach
    
    // Function to return length of
    // smallest subarray containing both
    // maximum and minimum value
    function minSubarray(A, n)
    {

        // find maximum and minimum
        // values in the array
        let minValue = Number.MAX_VALUE;
        let maxValue = Number.MIN_VALUE;
        for (let i = 0; i < n; i++) 
        {
            minValue = Math.min(minValue, A[i]);
            maxValue = Math.max(maxValue, A[i]);
        }

        let pos_min = -1, pos_max = -1, ans = Number.MAX_VALUE;

        // iterate over the array and set answer
        // to smallest difference between position
        // of maximum and position of minimum value
        for (let i = 0; i < n; i++) {

            // last occurrence of minValue
            if (A[i] == minValue)
                pos_min = i;

            // last occurrence of maxValue
            if (A[i] == maxValue)
                pos_max = i;

            if (pos_max != -1 && pos_min != -1)
                ans = Math.min(ans, Math.abs(pos_min - pos_max) + 1);
        }

        return ans;
    }
    
    let A = [ 1, 5, 9, 7, 1, 9, 4 ];
    let n = A.length;
  
    document.write(minSubarray(A, n));

</script>

Output
2

Complexity Analysis:

  • Time Complexity: O(n)
  • Auxiliary Space: O(1)

Next Article

Similar Reads