📜  可以单独排序以进行排序的最大分区数

📅  最后修改于: 2021-04-29 02:22:37             🧑  作者: Mango

给定大小为n的数组arr [],使得arr []的元素在[0,1,..n-1]范围内,其中每个数字最多出现一次。我们的任务是将数组划分为可以单独排序的最大分区数,然后进行连接以对整个数组进行排序。
例子 :

Input : arr[] = [2, 1, 0, 3]
Output : 2
If divide arr[] into two partitions
{2, 1, 0} and {3}, sort then and concatenate
then, we get the whole array sorted.

Input : arr[] = [2, 1, 0, 3, 4, 5]
Output : 4
The maximum number of partitions are four, we
get these partitions as {2, 1, 0}, {3}, {4} 
and {5}

Input : arr[] = [0, 1, 2, 3, 4, 5]
Output : 6
The maximum number of partitions are six, we
get these partitions as {0}, {1}, {2}, {3}, {4} 
and {5}

这个想法基于这样一个事实,即如果i处的元素最大为前缀arr [0..i],那么我们可以创建一个以i结尾的分区。

C++
// CPP program to find Maximum number of partitions
// such that we can get a sorted array.
#include 
using namespace std;
 
// Function to find maximum partitions.
int maxPartitions(int arr[], int n)
{
    int ans = 0, max_so_far = 0;
    for (int i = 0; i < n; ++i) {
 
        // Find maximum in prefix arr[0..i]
        max_so_far = max(max_so_far, arr[i]);
 
        // If maximum so far is equal to index,
        // we can make a new partition ending at
        // index i.
        if (max_so_far == i)
            ans++;
    }
    return ans;
}
 
// Driver code
int main()
{
    int arr[] = { 1, 0, 2, 3, 4 };
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << maxPartitions(arr, n);
    return 0;
}


Java
// java program to find Maximum number of partitions
// such that we can get a sorted array
 
import java.io.*;
 
class GFG
{
    // Function to find maximum partitions.
    static int maxPartitions(int arr[], int n)
    {
        int ans = 0, max_so_far = 0;
        for (int i = 0; i < n; ++i) {
     
            // Find maximum in prefix arr[0..i]
            max_so_far = Math.max(max_so_far, arr[i]);
     
            // If maximum so far is equal to index,
            // we can make a new partition ending at
            // index i.
            if (max_so_far == i)
                ans++;
        }
        return ans;
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int arr[] = { 1, 0, 2, 3, 4 };
        int n = arr.length;
        System.out.println (maxPartitions(arr, n));
             
    }
}
 
// This code is contributed by vt_m.


Python3
# Python3 program to find Maximum
# number of partitions such that
# we can get a sorted array.
 
# Function to find maximum partitions.
def maxPartitions(arr, n):
 
    ans = 0; max_so_far = 0
    for i in range(0, n):
 
        # Find maximum in prefix arr[0..i]
        max_so_far = max(max_so_far, arr[i])
 
        # If maximum so far is equal to
        # index, we can make a new partition
        # ending at index i.
        if (max_so_far == i):
            ans += 1
     
    return ans
 
# Driver code
arr = [1, 0, 2, 3, 4]
n = len(arr)
print(maxPartitions(arr, n))
 
# This code is contributed by Smitha Dinesh Semwal.


C#
// C# program to find Maximum number of partitions
// such that we can get a sorted array
using System;
 
class GFG
{
    // Function to find maximum partitions.
    static int maxPartitions(int []arr, int n)
    {
        int ans = 0, max_so_far = 0;
        for (int i = 0; i < n; ++i)
        {
     
            // Find maximum in prefix arr[0..i]
            max_so_far = Math.Max(max_so_far, arr[i]);
     
            // If maximum so far is equal to index,
            // we can make a new partition ending at
            // index i.
            if (max_so_far == i)
                ans++;
        }
        return ans;
    }
     
    // Driver code
    public static void Main ()
    {
        int []arr = { 1, 0, 2, 3, 4 };
        int n = arr.Length;
        Console.Write (maxPartitions(arr, n));
             
    }
}
 
// This code is contributed by nitin mittal.


PHP


Javascript


输出:
4