Número máximo de puntos fijos usando al menos 1 intercambio

Dada una permutación de N elementos (los elementos están en el rango de 0 a N-1). Un punto fijo es un índice en el que el valor es el mismo que el índice (es decir, a[i]=i ). Tienes permitido hacer como máximo 1 intercambio. Encuentra el número máximo de puntos fijos que puedes obtener.
Ejemplos
 

Input : N = 5
        arr[] = {0, 1, 3, 4, 2}
Output : 3
2 and 3 can be swapped to get:
0 1 2 4 3
which has 3 fixed points.

Input : N = 5
        a[] = {0, 1, 2, 4, 3}
Output : 5 

Dado que solo se nos permite hacer 1 intercambio, la cantidad de puntos fijos se puede aumentar como máximo en 2.
Tengamos una array pos que mantenga la posición de cada elemento en la array de entrada. Ahora, recorremos la array y tenemos los siguientes casos: 
 

  • Si a[i] = i. Simplemente podemos incrementar el conteo y seguir adelante.
  • Si, pos[i] = a[i], lo que significa que el intercambio de los 2 términos haría que i y a[i] fueran puntos fijos, por lo tanto, aumentaría el conteo en 2. Tenga en cuenta que el intercambio se puede realizar al menos una vez.

Al final del recorrido, si no hemos hecho ningún intercambio, significa que nuestro intercambio no pudo aumentar la cuenta en 2, por lo que ahora si hay al menos 2 elementos que no son puntos fijos, podemos hacer un intercambio. para aumentar la cuenta en 1, es decir, convertir uno de esos puntos en un punto fijo.
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// CPP program to find maximum number of
// fixed points using atmost 1 swap
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find maximum number of
// fixed points using atmost 1 swap
int maximumFixedPoints(int a[], int n)
{
    int i, pos[n], count = 0, swapped = 0;
 
    // Store position of each element in
    // input array
    for (i = 0; i < n; i++)
        pos[a[i]] = i;
 
    for (i = 0; i < n; i++) {
 
        // If fixed point, increment count
        if (a[i] == i)
            count++;
 
        // Else check if swapping increments
        // count by 2
        else if (swapped == 0 && pos[i] == a[i]) {
            count += 2;
            swapped = 1;
        }
    }
 
    // If not swapped yet and elements remaining
    if (swapped == 0 && count < n - 1)
        count++;
 
    return count;
}
 
// Driver Code
int main()
{
    int a[] = { 0, 1, 3, 4, 2 };
 
    int n = sizeof(a) / sizeof(a[0]);
 
    cout << maximumFixedPoints(a, n);
 
    return 0;
}

Java

// Java program to find maximum number of
// fixed points using atmost 1 swap
import java.io.*;
 
class GFG {
  
 
// Function to find maximum number of
// fixed points using atmost 1 swap
static int maximumFixedPoints(int a[], int n)
{
    int i, count = 0, swapped = 0;
    int pos[] = new int[n];
 
    // Store position of each element in
    // input array
    for (i = 0; i < n; i++)
        pos[a[i]] = i;
 
    for (i = 0; i < n; i++) {
 
        // If fixed point, increment count
        if (a[i] == i)
            count++;
 
        // Else check if swapping increments
        // count by 2
        else if (swapped == 0 && pos[i] == a[i]) {
            count += 2;
            swapped = 1;
        }
    }
 
    // If not swapped yet and elements remaining
    if (swapped == 0 && count < n - 1)
        count++;
 
    return count;
}
 
// Driver Code
 
    public static void main (String[] args) {
            int []a= { 0, 1, 3, 4, 2 };
 
    int n = a.length;
 
    System.out.println(maximumFixedPoints(a, n));
    }
}
 
 
// This code is contributed
// by shs

Python3

# Python3 program to find the maximum number
# of fixed points using at most 1 swap
 
# Function to find maximum number of
# fixed points using atmost 1 swap
def maximumFixedPoints(a, n):
 
    pos = [None] * n
    count, swapped = 0, 0
 
    # Store position of each element
    # in input array
    for i in range(0, n):
        pos[a[i]] = i
 
    for i in range(0, n):
     
        # If fixed point, increment count
        if a[i] == i:
            count += 1
 
        # Else check if swapping increments
        # count by 2
        elif swapped == 0 and pos[i] == a[i]:
            count += 2
            swapped = 1
 
    # If not swapped yet and elements remaining
    if swapped == 0 and count < n - 1:
        count += 1
 
    return count
 
# Driver Code
if __name__ == "__main__":
 
    a = [0, 1, 3, 4, 2]
    n = len(a)
 
    print(maximumFixedPoints(a, n))
 
# This code is contributed by Rituraj Jain

C#

// C# program to find maximum number of
// fixed points using atmost 1 swap
using System;
 
class Program {
 
// Function to find maximum number of
// fixed points using atmost 1 swap
static int maximumFixedPoints(int []a, int n)
{
    int i, count = 0, swapped = 0;
    int []pos = new int[n];
 
    // Store position of each element in
    // input array
    for (i = 0; i < n; i++)
        pos[a[i]] = i;
 
    for (i = 0; i < n; i++) {
 
        // If fixed point, increment count
        if (a[i] == i)
            count++;
 
        // Else check if swapping increments
        // count by 2
        else if (swapped == 0 && pos[i] == a[i]) {
            count += 2;
            swapped = 1;
        }
    }
 
    // If not swapped yet and elements remaining
    if (swapped == 0 && count < n - 1)
        count++;
 
    return count;
}
 
    // Driver Code
    static void Main()
    {
        int []a= { 0, 1, 3, 4, 2 };
 
        int n = a.Length;
 
        Console.WriteLine(maximumFixedPoints(a, n));
    }
}
 
// This code is contributed
// by ANKITRAI1

PHP

<?php
// PHP program to find maximum number of
// fixed points using atmost 1 swap
 
// Function to find maximum number of
// fixed points using atmost 1 swap
function  maximumFixedPoints($a, $n)
{
    $i; $pos[$n]=array();
    $count = 0;
    $swapped = 0;
 
    // Store position of each element in
    // input array
    for ($i = 0; $i < $n; $i++)
        $pos[$a[$i]] = $i;
 
    for ($i = 0; $i < $n; $i++) {
 
        // If fixed point, increment count
        if ($a[$i] == $i)
            $count++;
 
        // Else check if swapping increments
        // count by 2
        else if ($swapped == 0 && $pos[$i] == $a[$i]) {
            $count += 2;
            $swapped = 1;
        }
    }
 
    // If not swapped yet and elements remaining
    if ($swapped == 0 && $count < $n - 1)
        $count++;
 
    return $count;
}
 
// Driver Code
     $a = array (0, 1, 3, 4, 2 );
        $n = sizeof($a) / sizeof($a[0]);
 
    echo maximumFixedPoints($a, $n);
 
 
// This code is contributed by Sachin
?>

Javascript

<script>
    // Javascript program to find maximum number of
    // fixed points using atmost 1 swap
     
    // Function to find maximum number of
    // fixed points using atmost 1 swap
    function maximumFixedPoints(a, n)
    {
        let i, count = 0, swapped = 0;
        let pos = new Array(n);
 
        // Store position of each element in
        // input array
        for (i = 0; i < n; i++)
            pos[a[i]] = i;
 
        for (i = 0; i < n; i++) {
 
            // If fixed point, increment count
            if (a[i] == i)
                count++;
 
            // Else check if swapping increments
            // count by 2
            else if (swapped == 0 && pos[i] == a[i]) {
                count += 2;
                swapped = 1;
            }
        }
 
        // If not swapped yet and elements remaining
        if (swapped == 0 && count < n - 1)
            count++;
 
        return count;
    }
     
    let a= [ 0, 1, 3, 4, 2 ];
   
    let n = a.length;
 
    document.write(maximumFixedPoints(a, n));
     
    // This code is contributed by divyesh072019.
</script>
Producción: 

3

 

Complejidad de tiempo: O(N)
 

Publicación traducida automáticamente

Artículo escrito por Abdullah Aslam y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *