Maximum number of fixed points using atmost 1 swap
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++
#include <bits/stdc++.h>
using namespace std;
int maximumFixedPoints( int a[], int n)
{
int i, pos[n], count = 0, swapped = 0;
for (i = 0; i < n; i++)
pos[a[i]] = i;
for (i = 0; i < n; i++) {
if (a[i] == i)
count++;
else if (swapped == 0 && pos[i] == a[i]) {
count += 2;
swapped = 1;
}
}
if (swapped == 0 && count < n - 1)
count++;
return count;
}
int main()
{
int a[] = { 0, 1, 3, 4, 2 };
int n = sizeof (a) / sizeof (a[0]);
cout << maximumFixedPoints(a, n);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int maximumFixedPoints( int a[], int n)
{
int i, count = 0 , swapped = 0 ;
int pos[] = new int [n];
for (i = 0 ; i < n; i++)
pos[a[i]] = i;
for (i = 0 ; i < n; i++) {
if (a[i] == i)
count++;
else if (swapped == 0 && pos[i] == a[i]) {
count += 2 ;
swapped = 1 ;
}
}
if (swapped == 0 && count < n - 1 )
count++;
return count;
}
public static void main (String[] args) {
int []a= { 0 , 1 , 3 , 4 , 2 };
int n = a.length;
System.out.println(maximumFixedPoints(a, n));
}
}
|
Python3
def maximumFixedPoints(a, n):
pos = [ None ] * n
count, swapped = 0 , 0
for i in range ( 0 , n):
pos[a[i]] = i
for i in range ( 0 , n):
if a[i] = = i:
count + = 1
elif swapped = = 0 and pos[i] = = a[i]:
count + = 2
swapped = 1
if swapped = = 0 and count < n - 1 :
count + = 1
return count
if __name__ = = "__main__" :
a = [ 0 , 1 , 3 , 4 , 2 ]
n = len (a)
print (maximumFixedPoints(a, n))
|
C#
using System;
class Program {
static int maximumFixedPoints( int []a, int n)
{
int i, count = 0, swapped = 0;
int []pos = new int [n];
for (i = 0; i < n; i++)
pos[a[i]] = i;
for (i = 0; i < n; i++) {
if (a[i] == i)
count++;
else if (swapped == 0 && pos[i] == a[i]) {
count += 2;
swapped = 1;
}
}
if (swapped == 0 && count < n - 1)
count++;
return count;
}
static void Main()
{
int []a= { 0, 1, 3, 4, 2 };
int n = a.Length;
Console.WriteLine(maximumFixedPoints(a, n));
}
}
|
PHP
<?php
function maximumFixedPoints( $a , $n )
{
$i ; $pos [ $n ]= array ();
$count = 0;
$swapped = 0;
for ( $i = 0; $i < $n ; $i ++)
$pos [ $a [ $i ]] = $i ;
for ( $i = 0; $i < $n ; $i ++) {
if ( $a [ $i ] == $i )
$count ++;
else if ( $swapped == 0 && $pos [ $i ] == $a [ $i ]) {
$count += 2;
$swapped = 1;
}
}
if ( $swapped == 0 && $count < $n - 1)
$count ++;
return $count ;
}
$a = array (0, 1, 3, 4, 2 );
$n = sizeof( $a ) / sizeof( $a [0]);
echo maximumFixedPoints( $a , $n );
?>
|
Javascript
<script>
function maximumFixedPoints(a, n)
{
let i, count = 0, swapped = 0;
let pos = new Array(n);
for (i = 0; i < n; i++)
pos[a[i]] = i;
for (i = 0; i < n; i++) {
if (a[i] == i)
count++;
else if (swapped == 0 && pos[i] == a[i]) {
count += 2;
swapped = 1;
}
}
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));
</script>
|
Time Complexity: O(N)
Last Updated :
06 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...