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 valueint 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 codeint 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 approachimport java.util.*;class GFG{// Function to return length of// smallest subarray containing both// maximum and minimum valuestatic 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 codepublic 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 approachimport sys# Function to return length of smallest # subarray containing both maximum and # minimum valuedef 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 codeA = [ 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 approachusing System;using System.Linq;public class GFG{ // Function to return length of// smallest subarray containing both// maximum and minimum valuestatic 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> |
2
Complexity Analysis:
- Time Complexity: O(n)
- Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
