📌  相关文章
📜  检查数组是否已排序和旋转

📅  最后修改于: 2022-05-13 01:57:49.161000             🧑  作者: Mango

检查数组是否已排序和旋转

给定一个包含 N 个不同整数的数组。任务是编写一个程序来检查这个数组是否被排序和逆时针旋转。排序后的数组不被认为是排序和旋转的,即应该至少有一个旋转。
例子

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

方法

  • 找到数组中的最小元素。
  • 现在,如果对数组进行排序,然后旋转最小元素之前的所有元素将按升序排列,并且最小元素之后的所有元素也将按升序排列。
  • 检查最小元素之前的所有元素是否按递增顺序排列。
  • 检查最小元素之后的所有元素是否按升序排列。
  • 检查数组的最后一个元素是否小于起始元素。
  • 如果以上三个条件都满足,则打印YES否则打印NO

下面是上述思想的实现:

C++
// CPP program to check if an array is
// sorted and rotated clockwise
#include 
#include 
 
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


Javascript


C++
#include 
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 then 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
        // then 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 then 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
        // then 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


输出
YES

方法二:

方法:

  • 取两个变量 x 和 y,初始化为 0。
  • 现在遍历数组。
  • 如果我们发现前一个元素小于当前元素,我们将 x 加一。
  • 否则,如果我们发现前一个元素大于当前元素,我们将 y 加一。
  • 遍历后,如果 x 和 y 中的任何一个不等于 1,则返回 false。
  • 如果 x 或 y 中的任何一个为 1,则将最后一个元素与第一个元素(第 0 个元素作为当前元素,最后一个元素作为前一个元素)进行比较。即,如果最后一个元素更大,则将 y 增加 1,否则将 x 增加 1。
  • 再次检查 x 和 y,如果任何一个等于 1,则返回 true。即数组被排序和旋转。否则返回假。

解释:

  • 这个想法很简单。如果数组被排序和旋转,元素要么增加要么减少,但有一个例外。所以我们计算元素比它的前一个元素大多少倍,以及这个元素比它的前一个元素小多少倍。
  • 特殊情况是数组已排序但未旋转。为此特别检查最后一个元素和第一个元素。

下面是上述方法的实现:

C++

#include 
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 then 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
        // then 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 then 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
        // then 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


输出
YES

时间复杂度: O(N)
辅助空间: O(1)