Given an array of N distinct integers. The task is to write a program to check if this array is sorted and rotated clockwise.
Note: A sorted array is not considered as sorted and rotated, i.e., there should be at least one rotation
Examples:
Input: arr[] = { 3, 4, 5, 1, 2 }
Output: YES
Explanation: 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[] = {3, 4, 6, 1, 2, 5}
Output: NO
Check if an array is sorted and rotated by finding the pivot element(minimum element):
To solve the problem follow the below idea:
Find the minimum element in the array and if the array has been sorted and rotated then the elements before and after the minimum element will be in sorted order only
Follow the given steps to solve the problem:
- Find the minimum element in the array.
- Now, if the array is sorted and then rotated, then 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 the minimum element are in increasing order.
- Check if all elements after the minimum element are in increasing order.
- Check if the last element of the array is smaller than the starting element, as this would make sure that the array has been rotated at least once.
- If all of the above three conditions satisfies then print YES otherwise print NO
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void checkIfSortRotated( int arr[], int n)
{
int minEle = INT_MAX;
int maxEle = INT_MIN;
int minIndex = -1;
for ( int i = 0; i < n; i++) {
if (arr[i] < minEle) {
minEle = arr[i];
minIndex = i;
}
}
int flag1 = 1;
for ( int i = 1; i < minIndex; i++) {
if (arr[i] < arr[i - 1]) {
flag1 = 0;
break ;
}
}
int flag2 = 1;
for ( int i = minIndex + 1; i < n; i++) {
if (arr[i] < arr[i - 1]) {
flag2 = 0;
break ;
}
}
if (flag1 && flag2 && (arr[n - 1] < arr[0]))
cout << "YES" ;
else
cout << "NO" ;
}
int main()
{
int arr[] = { 3, 4, 5, 1, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
checkIfSortRotated(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG {
static void checkIfSortRotated( int arr[], int n)
{
int minEle = Integer.MAX_VALUE;
int maxEle = Integer.MIN_VALUE;
int minIndex = - 1 ;
for ( int i = 0 ; i < n; i++) {
if (arr[i] < minEle) {
minEle = arr[i];
minIndex = i;
}
}
boolean flag1 = true ;
for ( int i = 1 ; i < minIndex; i++) {
if (arr[i] < arr[i - 1 ]) {
flag1 = false ;
break ;
}
}
boolean flag2 = true ;
for ( int i = minIndex + 1 ; i < n; i++) {
if (arr[i] < arr[i - 1 ]) {
flag2 = false ;
break ;
}
}
if (minIndex == 0 ) {
System.out.print( "NO" );
return ;
}
if (flag1 && flag2 && (arr[n - 1 ] < arr[ 0 ]))
System.out.println( "YES" );
else
System.out.print( "NO" );
}
public static void main(String[] args)
{
int arr[] = { 3 , 4 , 5 , 1 , 2 };
int n = arr.length;
checkIfSortRotated(arr, n);
}
}
|
Python3
import sys
def checkIfSortRotated(arr, n):
minEle = sys.maxsize
maxEle = - sys.maxsize - 1
minIndex = - 1
for i in range (n):
if arr[i] < minEle:
minEle = arr[i]
minIndex = i
flag1 = 1
for i in range ( 1 , minIndex):
if arr[i] < arr[i - 1 ]:
flag1 = 0
break
flag2 = 2
for i in range (minIndex + 1 , n):
if arr[i] < arr[i - 1 ]:
flag2 = 0
break
if (flag1 and flag2 and
arr[n - 1 ] < arr[ 0 ]):
print ( "YES" )
else :
print ( "NO" )
if __name__ = = "__main__" :
arr = [ 3 , 4 , 5 , 1 , 2 ]
n = len (arr)
checkIfSortRotated(arr, n)
|
C#
using System;
class GFG {
static void checkIfSortRotated( int [] arr, int n)
{
int minEle = int .MaxValue;
int minIndex = -1;
for ( int i = 0; i < n; i++) {
if (arr[i] < minEle) {
minEle = arr[i];
minIndex = i;
}
}
bool flag1 = true ;
for ( int i = 1; i < minIndex; i++) {
if (arr[i] < arr[i - 1]) {
flag1 = false ;
break ;
}
}
bool flag2 = true ;
for ( int i = minIndex + 1; i < n; i++) {
if (arr[i] < arr[i - 1]) {
flag2 = false ;
break ;
}
}
if (flag1 && flag2 && (arr[n - 1] < arr[0]))
Console.WriteLine( "YES" );
else
Console.WriteLine( "NO" );
}
public static void Main()
{
int [] arr = { 3, 4, 5, 1, 2 };
int n = arr.Length;
checkIfSortRotated(arr, n);
}
}
|
PHP
<?php
function checkIfSortRotated( $arr , $n )
{
$minEle = PHP_INT_MAX;
$maxEle = PHP_INT_MIN;
$minIndex = -1;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $arr [ $i ] < $minEle )
{
$minEle = $arr [ $i ];
$minIndex = $i ;
}
}
$flag1 = 1;
for ( $i = 1; $i < $minIndex ; $i ++)
{
if ( $arr [ $i ] < $arr [ $i - 1])
{
$flag1 = 0;
break ;
}
}
$flag2 = 1;
for ( $i = $minIndex + 1; $i < $n ; $i ++)
{
if ( $arr [ $i ] < $arr [ $i - 1])
{
$flag2 = 0;
break ;
}
}
if ( $flag1 && $flag2 &&
( $arr [ $n - 1] < $arr [0]))
echo ( "YES" );
else
echo ( "NO" );
}
$arr = array (3, 4, 5, 1, 2);
$n = count ( $arr );
checkIfSortRotated( $arr , $n );
?>
|
Javascript
<script>
function checkIfSortRotated(arr, n)
{
let minEle = Number.MAX_VALUE;
let minIndex = -1;
for (let i = 0; i < n; i++) {
if (arr[i] < minEle) {
minEle = arr[i];
minIndex = i;
}
}
let flag1 = true ;
for (let i = 1; i < minIndex; i++) {
if (arr[i] < arr[i - 1]) {
flag1 = false ;
break ;
}
}
let flag2 = true ;
for (let i = minIndex + 1; i < n; i++) {
if (arr[i] < arr[i - 1]) {
flag2 = false ;
break ;
}
}
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;
checkIfSortRotated(arr, n);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Check if an array is sorted and rotated by counting adjacent inversions:
To solve the problem follow the below idea:
As the array is sorted and rotated, so the case when the previous element is greater than the current element will occur only once. If this occurs zero times or more than one times then the array is not properly sorted and rotated
Follow the given steps to solve the problem:
- Take two variables to say x and y, initialized as 0
- Now traverse the array
- If the previous element is smaller than the current, increment x by one
- Else increment y by one.
- After traversal, if y is not equal to 1, return false.
- Then compare the last element with the first element (0th element as current, and last element as previous.) i.e. if the last element is greater increase y by one else increase x by one
- Again check if y equals one return true. i.e. Array is sorted and rotated. Else return false
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool checkRotatedAndSorted( int arr[], int n)
{
int x = 0, y = 0;
for ( int i = 0; i < n - 1; i++) {
if (arr[i] < arr[i + 1])
x++;
else
y++;
}
if (y == 1) {
if (arr[n - 1] < arr[0])
x++;
else
y++;
if (y == 1)
return true ;
}
return false ;
}
int main()
{
int arr[] = { 4, 5, 1, 2, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
if (checkRotatedAndSorted(arr, n))
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
static boolean checkIfSortRotated( int arr[], int n)
{
int x = 0 , y = 0 ;
for ( int i = 0 ; i < n - 1 ; i++) {
if (arr[i] < arr[i + 1 ])
x++;
else
y++;
}
if (y == 1 ) {
if (arr[n - 1 ] < arr[ 0 ])
x++;
else
y++;
if (y == 1 )
return true ;
}
return false ;
}
public static void main(String[] args)
{
int arr[] = { 5 , 1 , 2 , 3 , 4 };
int n = arr.length;
boolean x = checkIfSortRotated(arr, n);
if (x == true )
System.out.println( "YES" );
else
System.out.println( "NO" );
}
}
|
Python3
def checkRotatedAndSorted(arr, n):
x = 0
y = 0
for i in range (n - 1 ):
if (arr[i] < arr[i + 1 ]):
x + = 1
else :
y + = 1
if (y = = 1 ):
if (arr[n - 1 ] < arr[ 0 ]):
x + = 1
else :
y + = 1
if (y = = 1 ):
return True
return False
arr = [ 4 , 5 , 1 , 2 , 3 ]
n = len (arr)
if (checkRotatedAndSorted(arr, n)):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
public class GFG {
static bool checkIfSortRotated( int [] arr, int n)
{
int x = 0, y = 0;
for ( int i = 0; i < n - 1; i++) {
if (arr[i] < arr[i + 1])
x++;
else
y++;
}
if (y == 1) {
if (arr[n - 1] < arr[0])
x++;
else
y++;
if (y == 1)
return true ;
}
return false ;
}
public static void Main(String[] args)
{
int [] arr = { 5, 1, 2, 3, 4 };
int n = arr.Length;
bool x = checkIfSortRotated(arr, n);
if (x == true )
Console.WriteLine( "YES" );
else
Console.WriteLine( "NO" );
}
}
|
Javascript
<script>
function checkIfSortRotated(arr, n)
{
var x = 0, y = 0;
for ( var i = 0; i < n - 1; i++) {
if (arr[i] < arr[i + 1])
x++;
else
y++;
}
if (y == 1) {
if (arr[n - 1] < arr[0])
x++;
else
y++;
if (y == 1)
return true ;
}
return false ;
}
var arr = [ 5, 1, 2, 3, 4 ];
var n = arr.length;
var x = checkIfSortRotated(arr, n);
if (x == true )
document.write( "YES" );
else
document.write( "NO" );
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)