📌  相关文章
📜  检查是否反转子数组使数组排序

📅  最后修改于: 2021-04-29 07:41:44             🧑  作者: Mango

给定一个由不同的n个整数组成的数组。任务是检查反转一个子数组是否使该数组排序。如果已对数组进行排序或通过对子数组进行排序后反转该数组,则打印“是”,否则打印“否”。
例子:

Input : arr [] = {1, 2, 5, 4, 3}
Output : Yes
By reversing the subarray {5, 4, 3}, 
the array will be sorted.

Input : arr [] = { 1, 2, 4, 5, 3 }
Output : No

方法1(简单:O(n 2 )
一个简单的解决方案是一个一个地考虑每个子数组。尝试反转每个子数组,然后检查反转子数组是否使整个数组排序。如果是,则返回true。如果反转任何子数组不能使数组排序,则返回false。方法2(排序:O(nlogn)):
想法是将给定的数组与排序的数组进行比较。复制给定数组并将其排序。现在,找到与排序数组不匹配的第一个索引和最后一个索引。如果找不到这样的索引,请打印“是”。否则,检查索引之间的元素是否按降序排列。
下面是上述方法的实现:

C++
// C++ program to check whether reversing a
// sub array make the array sorted or not
#include
using namespace std;
 
// Return true, if reversing the subarray will
// sort the array, else return false.
bool checkReverse(int arr[], int n)
{
    // Copying the array.
    int temp[n];
    for (int i = 0; i < n; i++)
        temp[i] = arr[i];
 
    // Sort the copied array.
    sort(temp, temp + n);
 
    // Finding the first mismatch.
    int front;
    for (front = 0; front < n; front++)
        if (temp[front] != arr[front])
            break;
 
    // Finding the last mismatch.
    int back;
    for (back = n - 1; back >= 0; back--)
        if (temp[back] != arr[back])
            break;
 
    // If whole array is sorted
    if (front >= back)
        return true;
 
    // Checking subarray is decreasing or not.
    do
    {
        front++;
        if (arr[front - 1] < arr[front])
            return false;
    } while (front != back);
 
    return true;
}
 
// Driven Program
int main()
{
    int arr[] = { 1, 2, 5, 4, 3 };
    int n = sizeof(arr)/sizeof(arr[0]);
 
    checkReverse(arr, n)? (cout << "Yes" << endl):
                          (cout << "No" << endl);
    return 0;
}


Java
// Java program to check whether reversing a
// sub array make the array sorted or not
 
import java.util.Arrays;
 
class GFG {
 
// Return true, if reversing the subarray will
// sort the array, else return false.
    static boolean checkReverse(int arr[], int n) {
        // Copying the array.
        int temp[] = new int[n];
        for (int i = 0; i < n; i++) {
            temp[i] = arr[i];
        }
 
        // Sort the copied array.
        Arrays.sort(temp);
 
        // Finding the first mismatch.
        int front;
        for (front = 0; front < n; front++) {
            if (temp[front] != arr[front]) {
                break;
            }
        }
 
        // Finding the last mismatch.
        int back;
        for (back = n - 1; back >= 0; back--) {
            if (temp[back] != arr[back]) {
                break;
            }
        }
 
        // If whole array is sorted
        if (front >= back) {
            return true;
        }
 
        // Checking subarray is decreasing or not.
        do {
            front++;
            if (arr[front - 1] < arr[front]) {
                return false;
            }
        } while (front != back);
 
        return true;
    }
 
// Driven Program
    public static void main(String[] args) {
 
        int arr[] = {1, 2, 5, 4, 3};
        int n = arr.length;
 
        if (checkReverse(arr, n)) {
            System.out.print("Yes");
        } else {
            System.out.print("No");
        }
    }
 
}
//This code contributed by 29AjayKumar


Python3
# Python3 program to check whether
# reversing a sub array make the
# array sorted or not
 
# Return true, if reversing the
# subarray will sort the array,
# else return false.
def checkReverse(arr, n):
 
    # Copying the array
    temp = [0] * n
    for i in range(n):
        temp[i] = arr[i]
 
    # Sort the copied array.
    temp.sort()
 
    # Finding the first mismatch.
    for front in range(n):
        if temp[front] != arr[front]:
            break
 
    # Finding the last mismatch.
    for back in range(n - 1, -1, -1):
        if temp[back] != arr[back]:
            break
 
    #If whole array is sorted
    if front >= back:
        return True
    while front != back:
        front += 1
        if arr[front - 1] < arr[front]:
            return False
    return True
 
# Driver code
arr = [1, 2, 5, 4, 3]
n = len(arr)
if checkReverse(arr, n) == True:
    print("Yes")
else:
    print("No")
 
# This code is contributed
# by Shrikant13


C#
// C# program to check whether reversing a
// sub array make the array sorted or not
using System;
 
class GFG
{
 
// Return true, if reversing the
// subarray will sort the array,
// else return false.
static bool checkReverse(int []arr, int n)
{
    // Copying the array.
    int []temp = new int[n];
    for (int i = 0; i < n; i++)
    {
        temp[i] = arr[i];
    }
 
    // Sort the copied array.
    Array.Sort(temp);
 
    // Finding the first mismatch.
    int front;
    for (front = 0; front < n; front++)
    {
        if (temp[front] != arr[front])
        {
            break;
        }
    }
 
    // Finding the last mismatch.
    int back;
    for (back = n - 1; back >= 0; back--)
    {
        if (temp[back] != arr[back])
        {
            break;
        }
    }
 
    // If whole array is sorted
    if (front >= back)
    {
        return true;
    }
 
    // Checking subarray is decreasing
    // or not.
    do
    {
        front++;
        if (arr[front - 1] < arr[front])
        {
            return false;
        }
    } while (front != back);
 
    return true;
}
 
// Driven Program
public static void Main()
{
    int []arr = {1, 2, 5, 4, 3};
    int n = arr.Length;
 
    if (checkReverse(arr, n))
    {
        Console.Write("Yes");
    }
    else
    {
        Console.Write("No");
    }
}
}
 
// This code is contributed
// by PrinciRaj


PHP
= 0; $back--)
        if ($temp[$back] != $arr[$back])
            break;
 
    // If whole array is sorted
    if ($front >= $back)
        return true;
 
    // Checking subarray is decreasing or not.
    do
    {
        $front++;
        if ($arr[$front - 1] < $arr[$front])
            return false;
    } while ($front != $back);
 
    return true;
}
 
// Driver Code
$arr = array( 1, 2, 5, 4, 3 );
$n = sizeof($arr);
 
if(checkReverse($arr, $n))
    echo "Yes" . "\n";
else
    echo "No" . "\n";
 
// This code is contributed
// by Akanksha Rai
?>


Javascript


C++
// C++ program to check whether reversing a sub array
// make the array sorted or not
#include
using namespace std;
 
// Return true, if reversing the subarray will sort t
// he array, else return false.
bool checkReverse(int arr[], int n)
{
    if (n == 1)
        return true;
 
    // Find first increasing part
    int i;
    for (i=1; i < n && arr[i-1] < arr[i]; i++);
    if (i == n)
        return true;
 
    // Find reversed part
    int j = i;
    while (j < n && arr[j] < arr[j-1])
    {
        if (i > 1 && arr[j] < arr[i-2])
            return false;
        j++;
    }
 
    if (j == n)
        return true;
 
    // Find last increasing part
    int k = j;
 
    // To handle cases like {1,2,3,4,20,9,16,17}
    if (arr[k] < arr[i-1])
       return false;
 
    while (k > 1 && k < n)
    {
        if (arr[k] < arr[k-1])
            return false;
        k++;
    }
    return true;
}
 
// Driven Program
int main()
{
    int arr[] = {1, 3, 4, 10, 9, 8};
    int n = sizeof(arr)/sizeof(arr[0]);
    checkReverse(arr, n)? cout << "Yes" : cout << "No";
    return 0;
}


Java
// Java program to check whether reversing a sub array
// make the array sorted or not
 
class GFG {
 
// Return true, if reversing the subarray will sort t
// he array, else return false.
    static boolean checkReverse(int arr[], int n) {
        if (n == 1) {
            return true;
        }
 
        // Find first increasing part
        int i;
        for (i = 1; arr[i - 1] < arr[i] && i < n; i++);
        if (i == n) {
            return true;
        }
 
        // Find reversed part
        int j = i;
        while (j < n && arr[j] < arr[j - 1]) {
            if (i > 1 && arr[j] < arr[i - 2]) {
                return false;
            }
            j++;
        }
 
        if (j == n) {
            return true;
        }
 
        // Find last increasing part
        int k = j;
 
        // To handle cases like {1,2,3,4,20,9,16,17}
        if (arr[k] < arr[i - 1]) {
            return false;
        }
 
        while (k > 1 && k < n) {
            if (arr[k] < arr[k - 1]) {
                return false;
            }
            k++;
        }
        return true;
    }
 
// Driven Program
    public static void main(String[] args) {
 
        int arr[] = {1, 3, 4, 10, 9, 8};
        int n = arr.length;
 
        if (checkReverse(arr, n)) {
            System.out.print("Yes");
        } else {
            System.out.print("No");
        }
    }
 
}
 
// This code is contributed
// by Rajput-Ji


Python3
# Python3 program to check whether reversing
# a sub array make the array sorted or not
import math as mt
 
# Return True, if reversing the subarray
# will sort the array, else return False.
def checkReverse(arr, n):
 
    if (n == 1):
        return True
 
    # Find first increasing part
    i = 1
    for i in range(1, n):
        if arr[i - 1] < arr[i] :
            if (i == n):
                return True
          
        else:
            break
 
    # Find reversed part
    j = i
    while (j < n and arr[j] < arr[j - 1]):
      
        if (i > 1 and arr[j] < arr[i - 2]):
            return False
        j += 1
 
    if (j == n):
        return True
 
    # Find last increasing part
    k = j
 
    # To handle cases like 1,2,3,4,20,9,16,17
    if (arr[k] < arr[i - 1]):
        return False
 
    while (k > 1 and k < n):
     
        if (arr[k] < arr[k - 1]):
            return False
        k += 1
     
    return True
 
# Driver Code
arr = [ 1, 3, 4, 10, 9, 8]
n = len(arr)
if checkReverse(arr, n):
    print("Yes")
else:
    print("No")
         
# This code is contributed by
# Mohit kumar 29


C#
// C# program to check whether reversing a
// sub array make the array sorted or not
  
using System;
public class GFG{
 
// Return true, if reversing the subarray will sort t
// he array, else return false.
    static bool checkReverse(int []arr, int n) {
        if (n == 1) {
            return true;
        }
 
        // Find first increasing part
        int i;
        for (i = 1; arr[i - 1] < arr[i] && i < n; i++);
        if (i == n) {
            return true;
        }
 
        // Find reversed part
        int j = i;
        while (j < n && arr[j] < arr[j - 1]) {
            if (i > 1 && arr[j] < arr[i - 2]) {
                return false;
            }
            j++;
        }
 
        if (j == n) {
            return true;
        }
 
        // Find last increasing part
        int k = j;
 
        // To handle cases like {1,2,3,4,20,9,16,17}
        if (arr[k] < arr[i - 1]) {
            return false;
        }
 
        while (k > 1 && k < n) {
            if (arr[k] < arr[k - 1]) {
                return false;
            }
            k++;
        }
        return true;
    }
 
 
// Driven Program
    public static void Main() {
 
        int []arr = {1, 3, 4, 10, 9, 8};
        int n = arr.Length;
 
        if (checkReverse(arr, n)) {
            Console.Write("Yes");
        } else {
            Console.Write("No");
        }
    }
}
// This code is contributed
// by 29AjayKumar


PHP
 1 && $arr[$j] < $arr[$i - 2])
            return false;
        $j++;
    }
 
    if ($j == $n)
        return true;
 
    // Find last increasing part
    $k = $j;
 
    // To handle cases like {1,2,3,4,20,9,16,17}
    if ($arr[$k] < $arr[$i - 1])
    return false;
 
    while ($k > 1 && $k < $n)
    {
        if ($arr[$k] < $arr[$k - 1])
            return false;
        $k++;
    }
    return true;
}
 
// Driver Code
$arr = array(1, 3, 4, 10, 9, 8);
$n = sizeof($arr);
if(checkReverse($arr, $n))
    echo "Yes";
else
    echo "No";
 
// This code is contributed
// by Akanksha Rai(Abby_akku)
?>


Javascript


输出:

Yes

时间复杂度: O(nlogn)。方法3(线性:O(n)):
观察到,当对数组进行排序或数组由三部分组成时,答案将为“是”。第一部分是增加子数组,然后减少子数组,然后再次增加子数组。因此,我们需要检查数组包含递增元素,然后包含递减元素,然后包含递增元素。在其他所有情况下,答案均为“否”。
以下是此方法的实现:

C++

// C++ program to check whether reversing a sub array
// make the array sorted or not
#include
using namespace std;
 
// Return true, if reversing the subarray will sort t
// he array, else return false.
bool checkReverse(int arr[], int n)
{
    if (n == 1)
        return true;
 
    // Find first increasing part
    int i;
    for (i=1; i < n && arr[i-1] < arr[i]; i++);
    if (i == n)
        return true;
 
    // Find reversed part
    int j = i;
    while (j < n && arr[j] < arr[j-1])
    {
        if (i > 1 && arr[j] < arr[i-2])
            return false;
        j++;
    }
 
    if (j == n)
        return true;
 
    // Find last increasing part
    int k = j;
 
    // To handle cases like {1,2,3,4,20,9,16,17}
    if (arr[k] < arr[i-1])
       return false;
 
    while (k > 1 && k < n)
    {
        if (arr[k] < arr[k-1])
            return false;
        k++;
    }
    return true;
}
 
// Driven Program
int main()
{
    int arr[] = {1, 3, 4, 10, 9, 8};
    int n = sizeof(arr)/sizeof(arr[0]);
    checkReverse(arr, n)? cout << "Yes" : cout << "No";
    return 0;
}

Java

// Java program to check whether reversing a sub array
// make the array sorted or not
 
class GFG {
 
// Return true, if reversing the subarray will sort t
// he array, else return false.
    static boolean checkReverse(int arr[], int n) {
        if (n == 1) {
            return true;
        }
 
        // Find first increasing part
        int i;
        for (i = 1; arr[i - 1] < arr[i] && i < n; i++);
        if (i == n) {
            return true;
        }
 
        // Find reversed part
        int j = i;
        while (j < n && arr[j] < arr[j - 1]) {
            if (i > 1 && arr[j] < arr[i - 2]) {
                return false;
            }
            j++;
        }
 
        if (j == n) {
            return true;
        }
 
        // Find last increasing part
        int k = j;
 
        // To handle cases like {1,2,3,4,20,9,16,17}
        if (arr[k] < arr[i - 1]) {
            return false;
        }
 
        while (k > 1 && k < n) {
            if (arr[k] < arr[k - 1]) {
                return false;
            }
            k++;
        }
        return true;
    }
 
// Driven Program
    public static void main(String[] args) {
 
        int arr[] = {1, 3, 4, 10, 9, 8};
        int n = arr.length;
 
        if (checkReverse(arr, n)) {
            System.out.print("Yes");
        } else {
            System.out.print("No");
        }
    }
 
}
 
// This code is contributed
// by Rajput-Ji

Python3

# Python3 program to check whether reversing
# a sub array make the array sorted or not
import math as mt
 
# Return True, if reversing the subarray
# will sort the array, else return False.
def checkReverse(arr, n):
 
    if (n == 1):
        return True
 
    # Find first increasing part
    i = 1
    for i in range(1, n):
        if arr[i - 1] < arr[i] :
            if (i == n):
                return True
          
        else:
            break
 
    # Find reversed part
    j = i
    while (j < n and arr[j] < arr[j - 1]):
      
        if (i > 1 and arr[j] < arr[i - 2]):
            return False
        j += 1
 
    if (j == n):
        return True
 
    # Find last increasing part
    k = j
 
    # To handle cases like 1,2,3,4,20,9,16,17
    if (arr[k] < arr[i - 1]):
        return False
 
    while (k > 1 and k < n):
     
        if (arr[k] < arr[k - 1]):
            return False
        k += 1
     
    return True
 
# Driver Code
arr = [ 1, 3, 4, 10, 9, 8]
n = len(arr)
if checkReverse(arr, n):
    print("Yes")
else:
    print("No")
         
# This code is contributed by
# Mohit kumar 29

C#

// C# program to check whether reversing a
// sub array make the array sorted or not
  
using System;
public class GFG{
 
// Return true, if reversing the subarray will sort t
// he array, else return false.
    static bool checkReverse(int []arr, int n) {
        if (n == 1) {
            return true;
        }
 
        // Find first increasing part
        int i;
        for (i = 1; arr[i - 1] < arr[i] && i < n; i++);
        if (i == n) {
            return true;
        }
 
        // Find reversed part
        int j = i;
        while (j < n && arr[j] < arr[j - 1]) {
            if (i > 1 && arr[j] < arr[i - 2]) {
                return false;
            }
            j++;
        }
 
        if (j == n) {
            return true;
        }
 
        // Find last increasing part
        int k = j;
 
        // To handle cases like {1,2,3,4,20,9,16,17}
        if (arr[k] < arr[i - 1]) {
            return false;
        }
 
        while (k > 1 && k < n) {
            if (arr[k] < arr[k - 1]) {
                return false;
            }
            k++;
        }
        return true;
    }
 
 
// Driven Program
    public static void Main() {
 
        int []arr = {1, 3, 4, 10, 9, 8};
        int n = arr.Length;
 
        if (checkReverse(arr, n)) {
            Console.Write("Yes");
        } else {
            Console.Write("No");
        }
    }
}
// This code is contributed
// by 29AjayKumar

的PHP

 1 && $arr[$j] < $arr[$i - 2])
            return false;
        $j++;
    }
 
    if ($j == $n)
        return true;
 
    // Find last increasing part
    $k = $j;
 
    // To handle cases like {1,2,3,4,20,9,16,17}
    if ($arr[$k] < $arr[$i - 1])
    return false;
 
    while ($k > 1 && $k < $n)
    {
        if ($arr[$k] < $arr[$k - 1])
            return false;
        $k++;
    }
    return true;
}
 
// Driver Code
$arr = array(1, 3, 4, 10, 9, 8);
$n = sizeof($arr);
if(checkReverse($arr, $n))
    echo "Yes";
else
    echo "No";
 
// This code is contributed
// by Akanksha Rai(Abby_akku)
?>

Java脚本


输出:

Yes