Check if an array is sorted and rotated
Given an array of N distinct integers. The task is to write a program to check if this array is sorted and rotated counter-clockwise. A sorted array is not considered as sorted and rotated, i.e., there should at least one rotation.
Examples:
Input : arr[] = { 3, 4, 5, 1, 2 } Output : YES The above array is sorted and rotated. Sorted array: {1, 2, 3, 4, 5}. Rotating this sorted array clockwise by 3 positions, we get: { 3, 4, 5, 1, 2} Input: arr[] = {7, 9, 11, 12, 5} Output: YES Input: arr[] = {1, 2, 3} Output: NO Input: arr[] = {3, 4, 6, 1, 2, 5} Output: NO
Approach:
- Find the minimum element in the array.
- Now, if the array is sorted and then rotate all the elements before the minimum element will be in increasing order and all elements after the minimum element will also be in increasing order.
- Check if all elements before minimum element are in increasing order.
- Check if all elements after minimum element are in increasing order.
- Check if the last element of the array is smaller than the starting element.
- If all of the above three conditions satisfies then print YES otherwise print NO.
Below is the implementation of the above idea:
C++
// CPP program to check if an array is // sorted and rotated clockwise #include <climits> #include <iostream> using namespace std; // Function to check if an array is // sorted and rotated clockwise void checkIfSortRotated( int arr[], int n) { int minEle = INT_MAX; int maxEle = INT_MIN; int minIndex = -1; // Find the minimum element // and it's index for ( int i = 0; i < n; i++) { if (arr[i] < minEle) { minEle = arr[i]; minIndex = i; } } int flag1 = 1; // Check if all elements before minIndex // are in increasing order for ( int i = 1; i < minIndex; i++) { if (arr[i] < arr[i - 1]) { flag1 = 0; break ; } } int flag2 = 1; // Check if all elements after minIndex // are in increasing order for ( int i = minIndex + 1; i < n; i++) { if (arr[i] < arr[i - 1]) { flag2 = 0; break ; } } // Check if last element of the array // is smaller than the element just // starting element of the array // for arrays like [3,4,6,1,2,5] - not circular array if (flag1 && flag2 && (arr[n - 1] < arr[0])) cout << "YES" ; else cout << "NO" ; } // Driver code int main() { int arr[] = { 3, 4, 5, 1, 2 }; int n = sizeof (arr) / sizeof (arr[0]); // Function Call checkIfSortRotated(arr, n); return 0; } |
Java
// Java program to check if an // array is sorted and rotated // clockwise import java.io.*; class GFG { // Function to check if an array is // sorted and rotated clockwise static void checkIfSortRotated( int arr[], int n) { int minEle = Integer.MAX_VALUE; int maxEle = Integer.MIN_VALUE; int minIndex = - 1 ; // Find the minimum element // and it's index for ( int i = 0 ; i < n; i++) { if (arr[i] < minEle) { minEle = arr[i]; minIndex = i; } } boolean flag1 = true ; // Check if all elements before // minIndex are in increasing order for ( int i = 1 ; i < minIndex; i++) { if (arr[i] < arr[i - 1 ]) { flag1 = false ; break ; } } boolean flag2 = true ; // Check if all elements after // minIndex are in increasing order for ( int i = minIndex + 1 ; i < n; i++) { if (arr[i] < arr[i - 1 ]) { flag2 = false ; break ; } } // check if the minIndex is 0, i.e the first element // is the smallest , which is the case when array is // sorted but not rotated. if (minIndex == 0 ) { System.out.print( "NO" ); return ; } // Check if last element of the array // is smaller than the element just // before the element at minIndex // starting element of the array // for arrays like [3,4,6,1,2,5] - not sorted // circular array if (flag1 && flag2 && (arr[n - 1 ] < arr[ 0 ])) System.out.println( "YES" ); else System.out.print( "NO" ); } // Driver code public static void main(String[] args) { int arr[] = { 3 , 4 , 5 , 1 , 2 }; int n = arr.length; // Function Call checkIfSortRotated(arr, n); } } // This code is contributed // by inder_verma. |
Python3
# Python3 program to check if an # array is sorted and rotated clockwise import sys # Function to check if an array is # sorted and rotated clockwise def checkIfSortRotated(arr, n): minEle = sys.maxsize maxEle = - sys.maxsize - 1 minIndex = - 1 # Find the minimum element # and it's index for i in range (n): if arr[i] < minEle: minEle = arr[i] minIndex = i flag1 = 1 # Check if all elements before # minIndex are in increasing order for i in range ( 1 , minIndex): if arr[i] < arr[i - 1 ]: flag1 = 0 break flag2 = 2 # Check if all elements after # minIndex are in increasing order for i in range (minIndex + 1 , n): if arr[i] < arr[i - 1 ]: flag2 = 0 break # Check if last element of the array # is smaller than the element just # before the element at minIndex # starting element of the array # for arrays like [3,4,6,1,2,5] - not sorted circular array if (flag1 and flag2 and arr[n - 1 ] < arr[ 0 ]): print ( "YES" ) else : print ( "NO" ) # Driver code arr = [ 3 , 4 , 5 , 1 , 2 ] n = len (arr) # Function Call checkIfSortRotated(arr, n) # This code is contributed # by Shrikant13 |
C#
// C# program to check if an // array is sorted and rotated // clockwise using System; class GFG { // Function to check if an array is // sorted and rotated clockwise static void checkIfSortRotated( int [] arr, int n) { int minEle = int .MaxValue; // int maxEle = int.MinValue; int minIndex = -1; // Find the minimum element // and it's index for ( int i = 0; i < n; i++) { if (arr[i] < minEle) { minEle = arr[i]; minIndex = i; } } bool flag1 = true ; // Check if all elements before // minIndex are in increasing order for ( int i = 1; i < minIndex; i++) { if (arr[i] < arr[i - 1]) { flag1 = false ; break ; } } bool flag2 = true ; // Check if all elements after // minIndex are in increasing order for ( int i = minIndex + 1; i < n; i++) { if (arr[i] < arr[i - 1]) { flag2 = false ; break ; } } // Check if last element of the array // is smaller than the element just // before the element at minIndex // starting element of the array // for arrays like [3,4,6,1,2,5] - not circular // array if (flag1 && flag2 && (arr[n - 1] < arr[0])) Console.WriteLine( "YES" ); else Console.WriteLine( "NO" ); } // Driver code public static void Main() { int [] arr = { 3, 4, 5, 1, 2 }; int n = arr.Length; // Function Call checkIfSortRotated(arr, n); } } // This code is contributed // by inder_verma. |
PHP
<?php // PHP program to check if an // array is sorted and rotated // clockwise // Function to check if an array // is sorted and rotated clockwise function checkIfSortRotated( $arr , $n ) { $minEle = PHP_INT_MAX; $maxEle = PHP_INT_MIN; $minIndex = -1; // Find the minimum element // and it's index for ( $i = 0; $i < $n ; $i ++) { if ( $arr [ $i ] < $minEle ) { $minEle = $arr [ $i ]; $minIndex = $i ; } } $flag1 = 1; // Check if all elements before // minIndex are in increasing order for ( $i = 1; $i < $minIndex ; $i ++) { if ( $arr [ $i ] < $arr [ $i - 1]) { $flag1 = 0; break ; } } $flag2 = 1; // Check if all elements after // minIndex are in increasing order for ( $i = $minIndex + 1; $i < $n ; $i ++) { if ( $arr [ $i ] < $arr [ $i - 1]) { $flag2 = 0; break ; } } // Check if last element of the array // is smaller than the element just // starting element of the array // for arrays like [3,4,6,1,2,5] - not sorted circular array if ( $flag1 && $flag2 && ( $arr [ $n - 1] < $arr [ $0 ])) echo ( "YES" ); else echo ( "NO" ); } // Driver code $arr = array (3, 4, 5, 1, 2); //Function Call $n = count ( $arr ); checkIfSortRotated( $arr , $n ); // This code is contributed // by inder_verma. ?> |
Javascript
<script> // Javascript program to check if an // array is sorted and rotated // clockwise // Function to check if an array is // sorted and rotated clockwise function checkIfSortRotated(arr, n) { let minEle = Number.MAX_VALUE; // int maxEle = int.MinValue; let minIndex = -1; // Find the minimum element // and it's index for (let i = 0; i < n; i++) { if (arr[i] < minEle) { minEle = arr[i]; minIndex = i; } } let flag1 = true ; // Check if all elements before // minIndex are in increasing order for (let i = 1; i < minIndex; i++) { if (arr[i] < arr[i - 1]) { flag1 = false ; break ; } } let flag2 = true ; // Check if all elements after // minIndex are in increasing order for (let i = minIndex + 1; i < n; i++) { if (arr[i] < arr[i - 1]) { flag2 = false ; break ; } } // Check if last element of the array // is smaller than the element just // before the element at minIndex // starting element of the array // for arrays like [3,4,6,1,2,5] - not circular // array if (flag1 && flag2 && (arr[n - 1] < arr[0])) document.write( "YES" ); else document.write( "NO" ); } let arr = [ 3, 4, 5, 1, 2 ]; let n = arr.length; // Function Call checkIfSortRotated(arr, n); // This code is contributed by mukesh07. </script> |
Output
YES
Method 2:
Approach:
- Take two variable say x and y, initialized as 0.
- Now traverse array.
- If we find previous element is smaller than current, we increase x by one.
- Else If we find previous element is greater then current we increase y by one.
- After traversal if any of x and y is not equals to 1, return false.
- If any of x or y is 1, then compare last element with first element (0th element as current, and last element as previous.) i.e. if last element is greater increase y by one else increase x by one.
- Again check for x and y if any one is equals to one return true. i.e. Array is sorted and rotated. Else return false.
Explanation:
- The idea is simple. If array is sorted and rotated , element are either increasing or decreasing, but with one exception. So we count how many times the element is greater then its previous element, and how many times the element is smaller then its previous element.
- The special case is when array is sorted but not rotated. for this check last element with first element specially.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h> using namespace std; bool checkRotatedAndSorted( int arr[], int n) { // Your code here // Initializing two variables x,y as zero. int x = 0, y = 0; // Traversing array 0 to last element. // n-1 is taken as we used i+1. for ( int i = 0; i < n - 1; i++) { if (arr[i] < arr[i + 1]) x++; else y++; } // If till now both x,y are greater than 1 means // array is not sorted. If both any of x,y is zero // means array is not rotated. if (x == 1 || y == 1) { // Checking for last element with first. if (arr[n - 1] < arr[0]) x++; else y++; // Checking for final result. if (x == 1 || y == 1) return true ; } // If still not true then definitely false. return false ; } // Driver Code Starts. int main() { int arr[] = { 4, 5, 1, 2, 3 }; int n = sizeof (arr) / sizeof (arr[0]); // Function Call if (checkRotatedAndSorted(arr, n)) cout << "YES" << endl; else cout << "NO" << endl; return 0; } |
Java
import java.io.*; class GFG { // Function to check if an array is // Sorted and rotated clockwise static boolean checkIfSortRotated( int arr[], int n) { // Initializing two variables x,y as zero. int x = 0 , y = 0 ; // Traversing array 0 to last element. // n-1 is taken as we used i+1. for ( int i = 0 ; i < n - 1 ; i++) { if (arr[i] < arr[i + 1 ]) x++; else y++; } // If till now both x,y are greater // than 1 means array is not sorted. // If both any of x,y is zero means // array is not rotated. if (x == 1 || y == 1 ) { // Checking for last element with first. if (arr[n - 1 ] < arr[ 0 ]) x++; else y++; // Checking for final result. if (x == 1 || y == 1 ) return true ; } // If still not true then definitely false. return false ; } // Driver code public static void main(String[] args) { int arr[] = { 5 , 1 , 2 , 3 , 4 }; int n = arr.length; // Function Call boolean x = checkIfSortRotated(arr, n); if (x == true ) System.out.println( "YES" ); else System.out.println( "NO" ); } } |
Python3
def checkRotatedAndSorted(arr, n): # Your code here # Initializing two variables x,y as zero. x = 0 y = 0 # Traversing array 0 to last element. # n-1 is taken as we used i+1. for i in range (n - 1 ): if (arr[i] < arr[i + 1 ]): x + = 1 else : y + = 1 # If till now both x,y are greater than 1 means # array is not sorted. If both any of x,y is zero # means array is not rotated. if (x = = 1 or y = = 1 ): # Checking for last element with first. if (arr[n - 1 ] < arr[ 0 ]): x + = 1 else : y + = 1 # Checking for final result. if (x = = 1 or y = = 1 ): return True # If still not true then definitely false. return False # Driver Code Starts. arr = [ 4 , 5 , 1 , 2 , 3 ] n = len (arr) # Function Call if (checkRotatedAndSorted(arr, n)): print ( "YES" ) else : print ( "NO" ) # This code is contributed by shivanisinghss2110 |
C#
using System; public class GFG { // Function to check if an array is // Sorted and rotated clockwise static bool checkIfSortRotated( int []arr, int n) { // Initializing two variables x,y as zero. int x = 0, y = 0; // Traversing array 0 to last element. // n-1 is taken as we used i+1. for ( int i = 0; i < n - 1; i++) { if (arr[i] < arr[i + 1]) x++; else y++; } // If till now both x,y are greater // than 1 means array is not sorted. // If both any of x,y is zero means // array is not rotated. if (x == 1 || y == 1) { // Checking for last element with first. if (arr[n - 1] < arr[0]) x++; else y++; // Checking for readonly result. if (x == 1 || y == 1) return true ; } // If still not true then definitely false. return false ; } // Driver code public static void Main(String[] args) { int []arr = { 5, 1, 2, 3, 4 }; int n = arr.Length; // Function Call bool x = checkIfSortRotated(arr, n); if (x == true ) Console.WriteLine( "YES" ); else Console.WriteLine( "NO" ); } } // This code is contributed by umadevi9616 |
Javascript
<script> // JavaScript Function to check if an array is // Sorted and rotated clockwise function checkIfSortRotated(arr, n) { // Initializing two variables x,y as zero. var x = 0, y = 0; // Traversing array 0 to last element. // n-1 is taken as we used i+1. for ( var i = 0; i < n - 1; i++) { if (arr[i] < arr[i + 1]) x++; else y++; } // If till now both x,y are greater // than 1 means array is not sorted. // If both any of x,y is zero means // array is not rotated. if (x == 1 || y == 1) { // Checking for last element with first. if (arr[n - 1] < arr[0]) x++; else y++; // Checking for final result. if (x == 1 || y == 1) return true ; } // If still not true then definitely false. return false ; } // Driver code var arr = [ 5, 1, 2, 3, 4 ]; var n = arr.length; // Function Call var x = checkIfSortRotated(arr, n); if (x == true ) document.write( "YES" ); else document.write( "NO" ); // This code is contributed by shivanisinghss2110 </script> |
Output
YES
Time Complexity: O(N)
Auxiliary Space: O(1)