Given an unsorted array arr[0..n-1] of size n, find the minimum length subarray arr[s..e] such that sorting this subarray makes the whole array sorted.
Examples:
- If the input array is [10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60], your program should be able to find that the subarray lies between indexes 3 and 8.
- If the input array is [0, 1, 15, 25, 6, 7, 30, 40, 50], your program should be able to find that the subarray lies between indexes 2 and 5.
Approach 1:
Idea/Intuition :
Make a temporary array same as the given array ,sort the temporary array . Now check from starting at which index the element of the given array and temporary array are unequal and store it in temporary variable s . Repeat the above From the end and store the index at another temporary variable e . The length e-s+1 is the length of smallest unequal subarray .
Algorithm :
- Declare a temporary array temp same as given array arr.
- Sort the temporary array .
- Initialize variable s with 0 and e with 0.
- Checking the unequal element from start and storing it in s variable .
- Checking the equal element from end and storing it in e variable.
- Returning (e-s+1) .
- Printing the result .
Below is the implementation of above approach .
Code :
C++
#include <bits/stdc++.h>using namespace std;// function performing calculationint minLength(vector<int>& arr){ // temporary array equal to given array vector<int> temp = arr; // sorting the temporary array sort(temp.begin(), temp.end()); // initializing indices int s = 0, e = 0; // checking the unequal element from start and storing // it in s variable for (int i = 0; i < arr.size(); i++) { if (arr[i] != temp[i]) { s = i; break; } } // checking the unequal element from end and storing it // in e variable for (int i = arr.size() - 1; i >= 0; i--) { if (arr[i] != temp[i]) { e = i; break; } } // returning minimum length return (e - s + 1);}// driver functionint main(){ // given array arr vector<int> arr = { 10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60 }; // calling the function performing calculation and // printing the result cout << "Minimum length of subarray is : " << minLength(arr); return 0;} |
Python3
# importing the libraryfrom typing import List# function performing calculationdef minLength(arr: List[int]) -> int: # temporary array equal to given array temp = arr[:] # sorting the temporary array temp.sort() # initializing indices s = 0 e = 0 # checking the unequal element from start and storing # it in s variable for i in range(len(arr)): if arr[i] != temp[i]: s = i break # checking the unequal element from end and storing it # in e variable for i in range(len(arr)-1, -1, -1): if arr[i] != temp[i]: e = i break # returning minimum length return (e - s + 1)# driver functionif __name__ == '__main__': # given array arr arr = [10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60] # calling the function performing calculation and # printing the result print("Minimum length of subarray is : ", minLength(arr)) # This code is contributed by divyansh2212 |
C#
using System;using System.Linq;class Program{ //function performing calculations static int MinLength(int[] arr) { //temporary array equal to given array int[] temp = arr.ToArray(); //sorting the temporary array Array.Sort(temp); //initializing indices int s = 0; int e = 0; //checking the unequal element from start and storing it in s variable for (int i = 0; i < arr.Length; i++) { if (arr[i] != temp[i]) { s = i; break; } } //checking the unequal elements from end and storing it in e variable for (int i = arr.Length - 1; i >= 0; i--) { if (arr[i] != temp[i]) { e = i; break; } } //returning minimum length return e - s + 1; } static void Main(string[] args) { int[] arr = new int[] { 10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60 }; Console.WriteLine("Minimum length of subarray is : " + MinLength(arr)); }}//This code is contributed by snehalsalokhe |
Java
import java.util.*;public class GFG { // function performing calculation public static int minLength(ArrayList<Integer> arr) { // temporary array equal to given array ArrayList<Integer> temp = new ArrayList<Integer>(arr); // sorting the temporary array Collections.sort(temp); // initializing indices int s = 0, e = 0; // checking the unequal element from start and storing // it in s variable for (int i = 0; i < arr.size(); i++) { if (arr.get(i) != temp.get(i)) { s = i; break; } } // checking the unequal element from end and storing it // in e variable for (int i = arr.size() - 1; i >= 0; i--) { if (arr.get(i) != temp.get(i)) { e = i; break; } } // returning minimum length return (e - s + 1); } // driver function public static void main(String[] args) { // given array arr ArrayList<Integer> arr = new ArrayList<Integer>( Arrays.asList(10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60) ); // calling the function performing calculation and // printing the result System.out.println("Minimum length of subarray is : " + minLength(arr)); }} |
Javascript
// function performing calculationfunction minLength(arr){ // temporary array equal to given array let temp = []; for(let i=0;i<arr.length;i++) { temp.push(arr[i]); } // sorting the temporary array temp.sort(); // initializing indices let s = 0, e = 0; // checking the unequal element from start and storing // it in s variable for (let i = 0; i < arr.length; i++) { if (arr[i] != temp[i]) { s = i; break; } } // checking the unequal element from end and storing it // in e variable for (let i = arr.length - 1; i >= 0; i--) { if (arr[i] != temp[i]) { e = i; break; } } // returning minimum length return (e - s + 1);}// driver function // given array arrlet arr = [ 10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60 ]; // calling the function performing calculation and // printing the resultconsole.log("Minimum length of subarray is : " + minLength(arr)); // This code is contributed by akashish__ |
Minimum length of subarray is : 6
Time Complexity : O(NLog(N)) , where N is the size of given array
Space Complexity : O(N) , Space for temporary array temp .
Approach 2:
- Find the candidate unsorted subarray
- Scan from left to right and find the first element which is greater than the next element. Let s be the index of such an element. In the above example 1, s is 3 (index of 30).
- Scan from right to left and find the first element (first in right to left order) which is smaller than the next element (next in right to left order). Let e be the index of such an element. In the above example 1, e is 7 (index of 31).
- Check whether sorting the candidate unsorted subarray makes the complete array sorted or not. If not, then include more elements in the subarray.
- Find the minimum and maximum values in arr[s..e]. Let minimum and maximum values be min and max. min and max for [30, 25, 40, 32, 31] are 25 and 40 respectively.
- Find the first element (if there is any) in arr[0..s-1] which is greater than min, change s to index of this element. There is no such element in above example 1.
- Find the last element (if there is any) in arr[e+1..n-1] which is smaller than max, change e to index of this element. In the above example 1, e is changed to 8 (index of 35)
- Print s and e.
Below is the implementation of the above approach:
C++
// C++ program to find the Minimum length Unsorted Subarray, // sorting which makes the complete array sorted#include<bits/stdc++.h>using namespace std;void printUnsorted(int arr[], int n){int s = 0, e = n-1, i, max, min; // step 1(a) of above algofor (s = 0; s < n-1; s++){ if (arr[s] > arr[s+1]) break;}if (s == n-1){ cout << "The complete array is sorted"; return;}// step 1(b) of above algofor(e = n - 1; e > 0; e--){ if(arr[e] < arr[e-1]) break;}// step 2(a) of above algomax = arr[s]; min = arr[s];for(i = s + 1; i <= e; i++){ if(arr[i] > max) max = arr[i]; if(arr[i] < min) min = arr[i];}// step 2(b) of above algofor( i = 0; i < s; i++){ if(arr[i] > min) { s = i; break; } } // step 2(c) of above algofor( i = n -1; i >= e+1; i--){ if(arr[i] < max) { e = i; break; } } // step 3 of above algocout << "The unsorted subarray which" << " makes the given array" << endl << "sorted lies between the indices " << s << " and " << e;return;}int main(){ int arr[] = {10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60}; int arr_size = sizeof(arr)/sizeof(arr[0]); printUnsorted(arr, arr_size); getchar(); return 0;}// This code is contributed // by Akanksha Rai |
C
// C program to find the Minimum length Unsorted Subarray, // sorting which makes the complete array sorted#include<stdio.h> void printUnsorted(int arr[], int n){ int s = 0, e = n-1, i, max, min; // step 1(a) of above algo for (s = 0; s < n-1; s++) { if (arr[s] > arr[s+1]) break; } if (s == n-1) { printf("The complete array is sorted"); return; } // step 1(b) of above algo for(e = n - 1; e > 0; e--) { if(arr[e] < arr[e-1]) break; } // step 2(a) of above algo max = arr[s]; min = arr[s]; for(i = s + 1; i <= e; i++) { if(arr[i] > max) max = arr[i]; if(arr[i] < min) min = arr[i]; } // step 2(b) of above algo for( i = 0; i < s; i++) { if(arr[i] > min) { s = i; break; } } // step 2(c) of above algo for( i = n -1; i >= e+1; i--) { if(arr[i] < max) { e = i; break; } } // step 3 of above algo printf(" The unsorted subarray which makes the given array " " sorted lies between the indees %d and %d", s, e); return;} int main(){ int arr[] = {10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60}; int arr_size = sizeof(arr)/sizeof(arr[0]); printUnsorted(arr, arr_size); getchar(); return 0;} |
Java
// Java program to find the Minimum length Unsorted Subarray, // sorting which makes the complete array sortedimport java.io.*;class Main{ static void printUnsorted(int arr[], int n) { int s = 0, e = n-1, i, max, min; // step 1(a) of above algo for (s = 0; s < n-1; s++) { if (arr[s] > arr[s+1]) break; } if (s == n-1) { System.out.println("The complete array is sorted"); return; } // step 1(b) of above algo for(e = n - 1; e > 0; e--) { if(arr[e] < arr[e-1]) break; } // step 2(a) of above algo max = arr[s]; min = arr[s]; for(i = s + 1; i <= e; i++) { if(arr[i] > max) max = arr[i]; if(arr[i] < min) min = arr[i]; } // step 2(b) of above algo for( i = 0; i < s; i++) { if(arr[i] > min) { s = i; break; } } // step 2(c) of above algo for( i = n -1; i >= e+1; i--) { if(arr[i] < max) { e = i; break; } } // step 3 of above algo System.out.println(" The unsorted subarray which"+ " makes the given array sorted lies"+ " between the indices "+s+" and "+e); return; } public static void main(String args[]) { int arr[] = {10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60}; int arr_size = arr.length; printUnsorted(arr, arr_size); }} |
Python3
# Python3 program to find the Minimum length Unsorted Subarray, # sorting which makes the complete array sorteddef printUnsorted(arr, n): e = n-1 # step 1(a) of above algo for s in range(0,n-1): if arr[s] > arr[s+1]: break if s == n-1: print ("The complete array is sorted") exit() # step 1(b) of above algo e= n-1 while e > 0: if arr[e] < arr[e-1]: break e -= 1 # step 2(a) of above algo max = arr[s] min = arr[s] for i in range(s+1,e+1): if arr[i] > max: max = arr[i] if arr[i] < min: min = arr[i] # step 2(b) of above algo for i in range(s): if arr[i] > min: s = i break # step 2(c) of above algo i = n-1 while i >= e+1: if arr[i] < max: e = i break i -= 1 # step 3 of above algo print ("The unsorted subarray which makes the given array") print ("sorted lies between the indexes %d and %d"%( s, e))arr = [10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60]arr_size = len(arr)printUnsorted(arr, arr_size)# This code is contributed by Shreyanshi Arun |
C#
// C# program to find the Minimum length Unsorted Subarray, // sorting which makes the complete array sortedusing System;class GFG{ static void printUnsorted(int []arr, int n) { int s = 0, e = n-1, i, max, min; // step 1(a) of above algo for (s = 0; s < n-1; s++) { if (arr[s] > arr[s+1]) break; } if (s == n-1) { Console.Write("The complete " + "array is sorted"); return; } // step 1(b) of above algo for(e = n - 1; e > 0; e--) { if(arr[e] < arr[e-1]) break; } // step 2(a) of above algo max = arr[s]; min = arr[s]; for(i = s + 1; i <= e; i++) { if(arr[i] > max) max = arr[i]; if(arr[i] < min) min = arr[i]; } // step 2(b) of above algo for( i = 0; i < s; i++) { if(arr[i] > min) { s = i; break; } } // step 2(c) of above algo for( i = n -1; i >= e+1; i--) { if(arr[i] < max) { e = i; break; } } // step 3 of above algo Console.Write(" The unsorted subarray which"+ " makes the given array sorted lies \n"+ " between the indices "+s+" and "+e); return; } public static void Main() { int []arr = {10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60}; int arr_size = arr.Length; printUnsorted(arr, arr_size); }}// This code contributed by Sam007 |
PHP
<?php // PHP program to find the Minimum length Unsorted Subarray, // sorting which makes the complete array sortedfunction printUnsorted(&$arr, $n){ $s = 0; $e = $n - 1; // step 1(a) of above algo for ($s = 0; $s < $n - 1; $s++) { if ($arr[$s] > $arr[$s + 1]) break; } if ($s == $n - 1) { echo "The complete array is sorted"; return; } // step 1(b) of above algo for($e = $n - 1; $e > 0; $e--) { if($arr[$e] < $arr[$e - 1]) break; } // step 2(a) of above algo $max = $arr[$s]; $min = $arr[$s]; for($i = $s + 1; $i <= $e; $i++) { if($arr[$i] > $max) $max = $arr[$i]; if($arr[$i] < $min) $min = $arr[$i]; } // step 2(b) of above algo for( $i = 0; $i < $s; $i++) { if($arr[$i] > $min) { $s = $i; break; } } // step 2(c) of above algo for( $i = $n - 1; $i >= $e + 1; $i--) { if($arr[$i] < $max) { $e = $i; break; } } // step 3 of above algo echo " The unsorted subarray which makes " . "the given array " . "\n" . " sorted lies between the indees " . $s . " and " . $e; return;}// Driver code$arr = array(10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60);$arr_size = sizeof($arr);printUnsorted($arr, $arr_size);// This code is contributed // by ChitraNayal?> |
Javascript
<script>// Javascript program to find the Minimum length Unsorted Subarray, // sorting which makes the complete array sorted function printUnsorted(arr,n) { let s = 0, e = n-1, i, max, min; // step 1(a) of above algo for (s = 0; s < n-1; s++) { if (arr[s] > arr[s+1]) break; } if (s == n-1) { document.write("The complete array is sorted"); return; } // step 1(b) of above algo for(e = n - 1; e > 0; e--) { if(arr[e] < arr[e-1]) break; } // step 2(a) of above algo max = arr[s]; min = arr[s]; for(i = s + 1; i <= e; i++) { if(arr[i] > max) max = arr[i]; if(arr[i] < min) min = arr[i]; } // step 2(b) of above algo for( i = 0; i < s; i++) { if(arr[i] > min) { s = i; break; } } // step 2(c) of above algo for( i = n -1; i >= e+1; i--) { if(arr[i] < max) { e = i; break; } } // step 3 of above algo document.write(" The unsorted subarray which"+ " makes the given array sorted lies"+ " between the indees "+s+" and "+e); return; } let arr=[10, 12, 20, 30, 25, 40, 32, 31, 35, 50, 60]; let arr_size = arr.length; printUnsorted(arr, arr_size); // This code is contributed by avanitrachhadiya2155 </script> |
The unsorted subarray which makes the given array sorted lies between the indices 3 and 8
Time Complexity : O(n)
Auxiliary Space : O(1)
Please write comments if you find the above code/algorithm incorrect, or find better ways to solve the same problem.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Read More to that Topic: geeksforgeeks.org/find-the-minimum-length-unsorted-subarray-sorting-which-makes-the-complete-array-sorted/ […]