Maximum number of fixed points using atmost 1 swap - GeeksforGeeks

10 Feb, 2022
Given a permutation of N elements (Elements are in range 0 to N-1). A fixed point is an index at which the value is same as the index (That is, a[i]=i). You are allowed to make atmost 1 swap. Find the maximum number of fixed points that you can get.Examples:  
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 
 
Since we are allowed to make only 1 swap, the number of fixed points can be increased by atmost 2.Let’s have an array pos which keeps the position of each element in the input array. Now, we traverse the array and have the following cases:  
If, a[i] = i. We can simply increment the count and move on.
If, pos[i] = a[i] which means that swapping the 2 terms would make i and a[i] fixed points, hence increasing the count by 2. Keep in mind that swap can be done atmost once.
At the end of the traversal, if we haven’t made any swap, it means that our swap was not able to increase count by 2, so now if there are at least 2 elements which are not fixed points, we can make a swap to increase count by 1, i.e make one of those points a fixed point.Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// 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 swapint 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 Codeint main(){    int a[] = { 0, 1, 3, 4, 2 };     int n = sizeof(a) / sizeof(a[0]);     cout << maximumFixedPoints(a, n);     return 0;}
// Java program to find maximum number of// fixed points using atmost 1 swapimport java.io.*; class GFG {   // Function to find maximum number of// fixed points using atmost 1 swapstatic 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 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 swapdef 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 Codeif __name__ == "__main__":     a = [0, 1, 3, 4, 2]    n = len(a)     print(maximumFixedPoints(a, n)) # This code is contributed by Rituraj Jain
// C# program to find maximum number of// fixed points using atmost 1 swapusing System; class Program { // Function to find maximum number of// fixed points using atmost 1 swapstatic 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 program to find maximum number of// fixed points using atmost 1 swap // Function to find maximum number of// fixed points using atmost 1 swapfunction  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?>
<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>
3
 
Time Complexity: O(N) 
Shashank12
ankthon
Sach_Code
rituraj_jain
Akanksha_Rai
divyesh072019
simmytarika5
array-rearrange
limited-range-elements
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Next Greater Element
Window Sliding Technique
Count pairs with given sum
Program to find sum of elements in a given array
Reversal algorithm for array rotation
Find subarray with given sum | Set 1 (Nonnegative Numbers)
Building Heap from Array
Remove duplicates from sorted array
Sliding Window Maximum (Maximum of all subarrays of size k)
Move all negative numbers to beginning and positive to end with constant extra space