Check if it is possible to make array increasing or decreasing by rotating the array
Last Updated :
11 Nov, 2021
Given an array arr[] of N distinct elements, the task is to check if it is possible to make the array increasing or decreasing by rotating the array in any direction.
Examples:
Input: arr[] = {4, 5, 6, 2, 3}
Output: Yes
Array can be rotated as {2, 3, 4, 5, 6}
Input: arr[] = {1, 2, 4, 3, 5}
Output: No
Approach: There are four possibilities:
- If the array is already increasing then the answer is Yes.
- If the array is already decreasing then the answer is Yes.
- If the array can be made increasing, this can be possible if the given array is first increasing up to the maximum element and then decreasing.
- If the array can be made decreasing, this can be possible if the given array is first decreasing up to the minimum element and then increasing.
If it is not possible to make the array increasing or decreasing then print No.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
// Function that returns true if the array
// can be made increasing or decreasing
// after rotating it in any direction
bool isPossible(int a[], int n)
{
// If size of the array is less than 3
if (n <= 2)
return true;
int flag = 0;
// Check if the array is already decreasing
for (int i = 0; i < n - 2; i++) {
if (!(a[i] > a[i + 1] and a[i + 1] > a[i + 2])) {
flag = 1;
break;
}
}
// If the array is already decreasing
if (flag == 0)
return true;
flag = 0;
// Check if the array is already increasing
for (int i = 0; i < n - 2; i++) {
if (!(a[i] < a[i + 1] and a[i + 1] < a[i + 2])) {
flag = 1;
break;
}
}
// If the array is already increasing
if (flag == 0)
return true;
// Find the indices of the minimum
// and the maximum value
int val1 = INT_MAX, mini = -1, val2 = INT_MIN, maxi;
for (int i = 0; i < n; i++) {
if (a[i] < val1) {
mini = i;
val1 = a[i];
}
if (a[i] > val2) {
maxi = i;
val2 = a[i];
}
}
flag = 1;
// Check if we can make array increasing
for (int i = 0; i < maxi; i++) {
if (a[i] > a[i + 1]) {
flag = 0;
break;
}
}
// If the array is increasing upto max index
// and minimum element is right to maximum
if (flag == 1 and maxi + 1 == mini) {
flag = 1;
// Check if array increasing again or not
for (int i = mini; i < n - 1; i++) {
if (a[i] > a[i + 1]) {
flag = 0;
break;
}
}
if (flag == 1)
return true;
}
flag = 1;
// Check if we can make array decreasing
for (int i = 0; i < mini; i++) {
if (a[i] < a[i + 1]) {
flag = 0;
break;
}
}
// If the array is decreasing upto min index
// and minimum element is left to maximum
if (flag == 1 and maxi - 1 == mini) {
flag = 1;
// Check if array decreasing again or not
for (int i = maxi; i < n - 1; i++) {
if (a[i] < a[i + 1]) {
flag = 0;
break;
}
}
if (flag == 1)
return true;
}
// If it is not possible to make the
// array increasing or decreasing
return false;
}
// Driver code
int main()
{
int a[] = { 4, 5, 6, 2, 3 };
int n = sizeof(a) / sizeof(a[0]);
if (isPossible(a, n))
cout << "Yes";
else
cout << "No";
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function that returns true if the array
// can be made increasing or decreasing
// after rotating it in any direction
static boolean isPossible(int a[], int n)
{
// If size of the array is less than 3
if (n <= 2)
return true;
int flag = 0;
// Check if the array is already decreasing
for (int i = 0; i < n - 2; i++)
{
if (!(a[i] > a[i + 1] &&
a[i + 1] > a[i + 2]))
{
flag = 1;
break;
}
}
// If the array is already decreasing
if (flag == 0)
return true;
flag = 0;
// Check if the array is already increasing
for (int i = 0; i < n - 2; i++)
{
if (!(a[i] < a[i + 1] &&
a[i + 1] < a[i + 2]))
{
flag = 1;
break;
}
}
// If the array is already increasing
if (flag == 0)
return true;
// Find the indices of the minimum
// && the maximum value
int val1 = Integer.MAX_VALUE, mini = -1,
val2 = Integer.MIN_VALUE, maxi = 0;
for (int i = 0; i < n; i++)
{
if (a[i] < val1)
{
mini = i;
val1 = a[i];
}
if (a[i] > val2)
{
maxi = i;
val2 = a[i];
}
}
flag = 1;
// Check if we can make array increasing
for (int i = 0; i < maxi; i++)
{
if (a[i] > a[i + 1])
{
flag = 0;
break;
}
}
// If the array is increasing upto max index
// && minimum element is right to maximum
if (flag == 1 && maxi + 1 == mini)
{
flag = 1;
// Check if array increasing again or not
for (int i = mini; i < n - 1; i++)
{
if (a[i] > a[i + 1])
{
flag = 0;
break;
}
}
if (flag == 1)
return true;
}
flag = 1;
// Check if we can make array decreasing
for (int i = 0; i < mini; i++)
{
if (a[i] < a[i + 1])
{
flag = 0;
break;
}
}
// If the array is decreasing upto min index
// && minimum element is left to maximum
if (flag == 1 && maxi - 1 == mini)
{
flag = 1;
// Check if array decreasing again or not
for (int i = maxi; i < n - 1; i++)
{
if (a[i] < a[i + 1])
{
flag = 0;
break;
}
}
if (flag == 1)
return true;
}
// If it is not possible to make the
// array increasing or decreasing
return false;
}
// Driver code
public static void main(String args[])
{
int a[] = { 4, 5, 6, 2, 3 };
int n = a.length;
if (isPossible(a, n))
System.out.println( "Yes");
else
System.out.println( "No");
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 implementation of the approach
import sys
# Function that returns True if the array
# can be made increasing or decreasing
# after rotating it in any direction
def isPossible(a, n):
# If size of the array is less than 3
if (n <= 2):
return True;
flag = 0;
# Check if the array is already decreasing
for i in range(n - 2):
if (not(a[i] > a[i + 1] and
a[i + 1] > a[i + 2])):
flag = 1;
break;
# If the array is already decreasing
if (flag == 0):
return True;
flag = 0;
# Check if the array is already increasing
for i in range(n - 2):
if (not(a[i] < a[i + 1] and
a[i + 1] < a[i + 2])):
flag = 1;
break;
# If the array is already increasing
if (flag == 0):
return True;
# Find the indices of the minimum
# and the maximum value
val1 = sys.maxsize; mini = -1;
val2 = -sys.maxsize; maxi = -1;
for i in range(n):
if (a[i] < val1):
mini = i;
val1 = a[i];
if (a[i] > val2):
maxi = i;
val2 = a[i];
flag = 1;
# Check if we can make array increasing
for i in range(maxi):
if (a[i] > a[i + 1]):
flag = 0;
break;
# If the array is increasing upto max index
# and minimum element is right to maximum
if (flag == 1 and maxi + 1 == mini):
flag = 1;
# Check if array increasing again or not
for i in range(mini, n - 1):
if (a[i] > a[i + 1]):
flag = 0;
break;
if (flag == 1):
return True;
flag = 1;
# Check if we can make array decreasing
for i in range(mini):
if (a[i] < a[i + 1]):
flag = 0;
break;
# If the array is decreasing upto min index
# and minimum element is left to maximum
if (flag == 1 and maxi - 1 == mini):
flag = 1;
# Check if array decreasing again or not
for i in range(maxi, n - 1):
if (a[i] < a[i + 1]):
flag = 0;
break;
if (flag == 1):
return True;
# If it is not possible to make the
# array increasing or decreasing
return False;
# Driver code
a = [ 4, 5, 6, 2, 3 ];
n = len(a);
if (isPossible(a, n)):
print("Yes");
else:
print("No");
# This code is contributed by Rajput-Ji
C#
// C# implementation of the approach
using System;
class GFG
{
// Function that returns true if the array
// can be made increasing or decreasing
// after rotating it in any direction
static bool isPossible(int []a, int n)
{
// If size of the array is less than 3
if (n <= 2)
return true;
int flag = 0;
// Check if the array is already decreasing
for (int i = 0; i < n - 2; i++)
{
if (!(a[i] > a[i + 1] &&
a[i + 1] > a[i + 2]))
{
flag = 1;
break;
}
}
// If the array is already decreasing
if (flag == 0)
return true;
flag = 0;
// Check if the array is already increasing
for (int i = 0; i < n - 2; i++)
{
if (!(a[i] < a[i + 1] &&
a[i + 1] < a[i + 2]))
{
flag = 1;
break;
}
}
// If the array is already increasing
if (flag == 0)
return true;
// Find the indices of the minimum
// && the maximum value
int val1 = int.MaxValue, mini = -1,
val2 = int.MinValue, maxi = 0;
for (int i = 0; i < n; i++)
{
if (a[i] < val1)
{
mini = i;
val1 = a[i];
}
if (a[i] > val2)
{
maxi = i;
val2 = a[i];
}
}
flag = 1;
// Check if we can make array increasing
for (int i = 0; i < maxi; i++)
{
if (a[i] > a[i + 1])
{
flag = 0;
break;
}
}
// If the array is increasing upto max index
// && minimum element is right to maximum
if (flag == 1 && maxi + 1 == mini)
{
flag = 1;
// Check if array increasing again or not
for (int i = mini; i < n - 1; i++)
{
if (a[i] > a[i + 1])
{
flag = 0;
break;
}
}
if (flag == 1)
return true;
}
flag = 1;
// Check if we can make array decreasing
for (int i = 0; i < mini; i++)
{
if (a[i] < a[i + 1])
{
flag = 0;
break;
}
}
// If the array is decreasing upto min index
// && minimum element is left to maximum
if (flag == 1 && maxi - 1 == mini)
{
flag = 1;
// Check if array decreasing again or not
for (int i = maxi; i < n - 1; i++)
{
if (a[i] < a[i + 1])
{
flag = 0;
break;
}
}
if (flag == 1)
return true;
}
// If it is not possible to make the
// array increasing or decreasing
return false;
}
// Driver code
public static void Main()
{
int []a = { 4, 5, 6, 2, 3 };
int n = a.Length;
if (isPossible(a, n))
Console.WriteLine( "Yes");
else
Console.WriteLine( "No");
}
}
// This code is contributed by AnkitRai01
JavaScript
<script>
// javascript implementation of the approach
// Function that returns true if the array
// can be made increasing or decreasing
// after rotating it in any direction
function isPossible(a , n) {
// If size of the array is less than 3
if (n <= 2)
return true;
var flag = 0;
// Check if the array is already decreasing
for (i = 0; i < n - 2; i++) {
if (!(a[i] > a[i + 1] && a[i + 1] > a[i + 2])) {
flag = 1;
break;
}
}
// If the array is already decreasing
if (flag == 0)
return true;
flag = 0;
// Check if the array is already increasing
for (i = 0; i < n - 2; i++) {
if (!(a[i] < a[i + 1] && a[i + 1] < a[i + 2])) {
flag = 1;
break;
}
}
// If the array is already increasing
if (flag == 0)
return true;
// Find the indices of the minimum
// && the maximum value
var val1 = Number.MAX_VALUE, mini = -1, val2 = Number.MIN_VALUE, maxi = 0;
for (i = 0; i < n; i++) {
if (a[i] < val1) {
mini = i;
val1 = a[i];
}
if (a[i] > val2) {
maxi = i;
val2 = a[i];
}
}
flag = 1;
// Check if we can make array increasing
for (i = 0; i < maxi; i++) {
if (a[i] > a[i + 1]) {
flag = 0;
break;
}
}
// If the array is increasing upto max index
// && minimum element is right to maximum
if (flag == 1 && maxi + 1 == mini) {
flag = 1;
// Check if array increasing again or not
for (i = mini; i < n - 1; i++) {
if (a[i] > a[i + 1]) {
flag = 0;
break;
}
}
if (flag == 1)
return true;
}
flag = 1;
// Check if we can make array decreasing
for (i = 0; i < mini; i++) {
if (a[i] < a[i + 1]) {
flag = 0;
break;
}
}
// If the array is decreasing upto min index
// && minimum element is left to maximum
if (flag == 1 && maxi - 1 == mini) {
flag = 1;
// Check if array decreasing again or not
for (i = maxi; i < n - 1; i++) {
if (a[i] < a[i + 1]) {
flag = 0;
break;
}
}
if (flag == 1)
return true;
}
// If it is not possible to make the
// array increasing or decreasing
return false;
}
// Driver code
var a = [ 4, 5, 6, 2, 3 ];
var n = a.length;
if (isPossible(a, n))
document.write("Yes");
else
document.write("No");
// This code contributed by umadevi9616
</script>
Time Complexity: O(N)
Auxiliary Space: O(1)
Similar Reads
Javascript Program to Check if it is possible to make array increasing or decreasing by rotating the array Given an array arr[] of N distinct elements, the task is to check if it is possible to make the array increasing or decreasing by rotating the array in any direction.Examples: Input: arr[] = {4, 5, 6, 2, 3} Output: Yes Array can be rotated as {2, 3, 4, 5, 6}Input: arr[] = {1, 2, 4, 3, 5} Output: No
4 min read
Check if it is possible to sort the array after rotating it Given an array of size N, the task is to determine whether its possible to sort the array or not by just one shuffle. In one shuffle, we can shift some contiguous elements from the end of the array and place it in the front of the array.For eg: A = {2, 3, 1, 2}, we can shift {1, 2} from the end of t
8 min read
Javascript Program to Check if it is possible to sort the array after rotating it Given an array of size N, the task is to determine whether its possible to sort the array or not by just one shuffle. In one shuffle, we can shift some contiguous elements from the end of the array and place it in the front of the array.For eg: A = {2, 3, 1, 2}, we can shift {1, 2} from the end of t
3 min read
Minimize Operation to Make Array Non-decreasing or Non-increasing Given an integer array arr[]. In one operation, you can choose an index i and either increment or decrement arr[i] by 1. The task is to find the minimum number of operations needed to make arr either non-decreasing or non-increasing. Example: Input: arr = [3, 2, 4, 5, 0]Output: 4Explanation: One pos
8 min read
Make the array non-decreasing with the given operation Given an array arr[] of size N, the task is to check if it is possible to make the array non-decreasing by applying the given operation at most once on each array element. In a single operation, one can decrease the element by one i.e. arr[i] = arr[i] - 1.Examples: Input: arr[] = {1, 2, 1, 2, 3} Out
6 min read