Check whether (i,j) exists such that arr[i] != arr[j] and arr[arr[i]] is equal to arr[arr[j]]
Last Updated :
25 Mar, 2023
Given an array A[]. The task is to determine if it is possible to choose two indices ‘i’ and ‘j’ such that the below conditions gets satisfied:-
- A[i] is not equal to A[j].
- A[A[i]] is equal to A[A[j]].
Note: The value of the elements in an array is less than the value of N i.e. For every i, arr[i] < N.
Examples:
Input: N = 4, A[] = {1, 1, 2, 3}
Output: Yes
As A[3] != to A[1] but A[A[3]] == A[A[1]]
Input: N = 4, A[] = {2, 1, 3, 3}
Output: No
As A[A[3]] == A[A[4]] but A[3] == A[4]
Approach:
- Start traversing the Array Arr[] by running two loops.
- The variable i point at the index 0 and variable j point to the next of i.
- If Arr[i] is not equal to Arr[j] then check if Arr[Arr[i] – 1] is equal to Arr[Arr[j] – 1]. If yes then return true.
Else check Arr[Arr[i]- 1] and Arr[Arr[j] – 1] for other indices also.
- Repeat the above step till all the elements/index gets traversed.
- If no such indices found return false.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool checkIndices( int Arr[], int N)
{
for ( int i = 0; i < N - 1; i++) {
for ( int j = i + 1; j < N; j++) {
if (Arr[i] != Arr[j]) {
if (Arr[Arr[i] - 1] == Arr[Arr[j] - 1])
return true ;
}
}
}
return false ;
}
int main()
{
int Arr[] = { 3, 2, 1, 1, 4 };
int N = sizeof (Arr) / sizeof (Arr[0]);
checkIndices(Arr, N) ? cout << "Yes"
: cout << "No" ;
return 0;
}
|
Java
class GFG
{
static boolean checkIndices( int Arr[], int N)
{
for ( int i = 0 ; i < N - 1 ; i++) {
for ( int j = i + 1 ; j < N; j++) {
if (Arr[i] != Arr[j]) {
if (Arr[Arr[i] - 1 ] == Arr[Arr[j] - 1 ])
return true ;
}
}
}
return false ;
}
public static void main(String args[])
{
int Arr[] = { 3 , 2 , 1 , 1 , 4 };
int N = Arr.length;
if (checkIndices(Arr, N))
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
|
Python 3
def checkIndices(Arr, N):
for i in range (N - 1 ):
for j in range (i + 1 , N):
if (Arr[i] ! = Arr[j]):
if (Arr[Arr[i] - 1 ] = = Arr[Arr[j] - 1 ]):
return True
return False
if __name__ = = "__main__" :
Arr = [ 3 , 2 , 1 , 1 , 4 ]
N = len (Arr)
if checkIndices(Arr, N):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static bool checkIndices( int []Arr, int N)
{
for ( int i = 0; i < N - 1; i++)
{
for ( int j = i + 1; j < N; j++)
{
if (Arr[i] != Arr[j])
{
if (Arr[Arr[i] - 1] == Arr[Arr[j] - 1])
return true ;
}
}
}
return false ;
}
static public void Main ()
{
int []Arr = { 3, 2, 1, 1, 4 };
int N = Arr.Length;
if (checkIndices(Arr, N))
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
}
|
PHP
<?php
function checkIndices( $Arr , $N )
{
for ( $i = 0; $i < $N - 1; $i ++)
{
for ( $j = $i + 1;
$j < $N ; $j ++)
{
if ( $Arr [ $i ] != $Arr [ $j ])
{
if ( $Arr [ $Arr [ $i ] - 1] == $Arr [ $Arr [ $j ] - 1])
return true;
}
}
}
return false;
}
$Arr = array (3, 2, 1, 1, 4);
$N = sizeof( $Arr );
if (checkIndices( $Arr , $N ))
echo "Yes" ;
else
echo "No" ;
?>
|
Javascript
<script>
function checkIndices(Arr, N)
{
for ( var i = 0; i < N - 1; i++) {
for ( var j = i + 1; j < N; j++) {
if (Arr[i] != Arr[j]) {
if (Arr[Arr[i] - 1] == Arr[Arr[j] - 1])
return true ;
}
}
}
return false ;
}
var Arr = [ 3, 2, 1, 1, 4 ];
var N = Arr.length;
checkIndices(Arr, N) ? document.write( "Yes" )
: document.write( "No" );
</script>
|
Complexity Analysis:
- Time Complexity: O(N2)
- Auxiliary Space: O(1)
Optimization: The above approach used can be optimized to O(n) with the help of an unordered_map.
The steps used in this approach are as follows:
- First, we use an unordered_map to store the mapping of Arr[i] to i+1.
- Then, we iterate through the array and check if Arr[i] is already present in the hash table(unordered_map).
- If it is present, we check if the corresponding index in the hash table has the same value as Arr[i]. If yes then we have found the required indices and return ‘true’. If not, we continue the iteration.
- If we reach the end of the iteration and have not found the required indices, we return false.
Below is the code for the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
bool checkIndices( int Arr[], int N)
{
unordered_map< int , int > mp;
for ( int i = 0; i < N; i++) {
if (mp.find(Arr[i]) != mp.end()) {
int j = mp[Arr[i]];
if (Arr[j-1] == Arr[i]) {
return true ;
}
}
mp[Arr[i]] = i+1;
}
return false ;
}
int main()
{
int Arr[] = { 3, 2, 1, 1, 4 };
int N = sizeof (Arr) / sizeof (Arr[0]);
checkIndices(Arr, N) ? cout << "Yes"
: cout << "No" ;
return 0;
}
|
Python3
def checkIndices(arr, n):
mp = {}
for i in range (n):
if arr[i] in mp:
j = mp[arr[i]]
if arr[j - 1 ] = = arr[i]:
return True
mp[arr[i]] = i + 1
return False
if __name__ = = "__main__" :
arr = [ 3 , 2 , 1 , 1 , 4 ]
n = len (arr)
print ( "Yes" if checkIndices(arr, n) else "No" )
|
Java
import java.io.*;
class GFG {
static boolean checkIndices( int Arr[], int N)
{
java.util.Map<Integer, Integer> mp
= new java.util.HashMap<>();
for ( int i = 0 ; i < N; i++) {
if (mp.containsKey(Arr[i])) {
int j = mp.get(Arr[i]);
if (Arr[j - 1 ] == Arr[i]) {
return true ;
}
}
mp.put(Arr[i], i + 1 );
}
return false ;
}
public static void main(String[] args)
{
int Arr[] = { 3 , 2 , 1 , 1 , 4 };
int N = Arr.length;
if (checkIndices(Arr, N)) {
System.out.println( "Yes" );
}
else {
System.out.println( "No" );
}
}
}
|
C#
using System;
using System.Collections.Generic;
class Program {
static bool checkIndices( int [] Arr, int N)
{
Dictionary< int , int > mp
= new Dictionary< int , int >();
for ( int i = 0; i < N; i++) {
if (mp.ContainsKey(Arr[i])) {
int j = mp[Arr[i]];
if (Arr[j - 1] == Arr[i]) {
return true ;
}
}
mp[Arr[i]] = i + 1;
}
return false ;
}
static void Main( string [] args)
{
int [] Arr = { 3, 2, 1, 1, 4 };
int N = Arr.Length;
Console.WriteLine(checkIndices(Arr, N) ? "Yes"
: "No" );
}
}
|
Javascript
function checkIndices(arr) {
let mp = {};
for (let i = 0; i < arr.length; i++) {
if (arr[i] in mp) {
let j = mp[arr[i]];
if (arr[j-1] == arr[i]) {
return true ;
}
}
mp[arr[i]] = i+1;
}
return false ;
}
let arr = [3, 2, 1, 1, 4];
console.log(checkIndices(arr) ? "Yes" : "No" );
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...