Smallest subarray containing minimum and maximum values

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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..

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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
?>

chevron_right


Output:

2


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.