Given an array where difference between adjacent elements is 1, write an algorithm to search for an element in the array and return the position of the element (return the first occurrence).
Examples :
Let element to be searched be x
Input: arr[] = {8, 7, 6, 7, 6, 5, 4, 3, 2, 3, 4, 3}
x = 3
Output: Element 3 found at index 7
Input: arr[] = {1, 2, 3, 4, 5, 4}
x = 5
Output: Element 5 found at index 4
A Simple Approach is to traverse the given array one by one and compare every element with given element ‘x’. If matches, then return index.
The above solution can be Optimized using the fact that difference between all adjacent elements is 1. The idea is to start comparing from the leftmost element and find the difference between current array element and x. Let this difference be ‘diff’. From the given property of array, we always know that x must be at-least ‘diff’ away, so instead of searching one by one, we jump ‘diff’.
Below is the implementation of above idea.
C++
#include <bits/stdc++.h>
using namespace std;
int search( int arr[], int n, int x)
{
int i = 0;
while (i < n) {
if (arr[i] == x)
return i;
i = i + abs (arr[i] - x);
}
cout << "number is not present!" ;
return -1;
}
int main()
{
int arr[] = { 8, 7, 6, 7, 6, 5, 4, 3, 2, 3, 4, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
int x = 3;
cout << "Element " << x << " is present at index "
<< search(arr, n, 3);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
int search( int arr[], int n, int x)
{
int i = 0;
while (i < n) {
if (arr[i] == x)
return i;
i = i + abs (arr[i] - x);
}
printf ( "number is not present!" );
return -1;
}
int main()
{
int arr[] = { 8, 7, 6, 7, 6, 5, 4, 3, 2, 3, 4, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
int x = 3;
printf ( "Element %d is present at index " ,
search(arr, n, 3));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int search( int arr[], int n, int x)
{
int i = 0 ;
while (i < n)
{
if (arr[i] == x)
return i;
i = i + Math.abs(arr[i]-x);
}
System.out.println ( "number is not" +
" present!" );
return - 1 ;
}
public static void main (String[] args) {
int arr[] = { 8 , 7 , 6 , 7 , 6 , 5 , 4 , 3 ,
2 , 3 , 4 , 3 };
int n = arr.length;
int x = 3 ;
System.out.println( "Element " + x +
" is present at index "
+ search(arr,n, 3 ));
}
}
|
Python 3
def search(arr, n, x):
i = 0
while (i < n):
if (arr[i] = = x):
return i
i = i + abs (arr[i] - x)
print ( "number is not present!" )
return - 1
arr = [ 8 , 7 , 6 , 7 , 6 , 5 , 4 , 3 , 2 , 3 , 4 , 3 ]
n = len (arr)
x = 3
print ( "Element" , x , " is present at index " ,
search(arr,n, 3 ))
|
C#
using System;
public class GFG
{
static int search( int []arr, int n,
int x)
{
int i = 0;
while (i < n)
{
if (arr[i] == x)
return i;
i = i + Math.Abs(arr[i] - x);
}
Console.WriteLine ( "number is not" +
" present!" );
return -1;
}
public static void Main()
{
int []arr = {8 ,7, 6, 7, 6, 5,
4,3, 2, 3, 4, 3 };
int n = arr.Length;
int x = 3;
Console.WriteLine( "Element " + x +
" is present at index "
+ search(arr, n, 3));
}
}
|
PHP
<?php
function search( $arr , $n , $x )
{
$i = 0;
while ( $i < $n )
{
if ( $arr [ $i ] == $x )
return $i ;
$i = $i + abs ( $arr [ $i ] - $x );
}
echo "number is not present!" ;
return -1;
}
$arr = array (8 ,7, 6, 7, 6, 5,
4, 3, 2, 3, 4, 3);
$n = sizeof( $arr );
$x = 3;
echo "Element " , $x , " is present " ,
"at index " , search( $arr , $n , 3);
?>
|
Javascript
<script>
function search(arr, n, x)
{
let i = 0;
while (i<n)
{
if (arr[i] == x)
return i;
i = i + Math.abs(arr[i]-x);
}
document.write( "number is not present!" );
return -1;
}
let arr = [8 ,7, 6, 7, 6, 5, 4, 3, 2, 3, 4, 3 ];
let n = arr.length;
let x = 3;
document.write( "Element " + x + " is present at index "
+ search(arr,n,3));
</script>
|
OutputElement 3 is present at index 7
Time Complexity: O(n)
Auxiliary Space: O(1)
Searching in an array where adjacent differ by at most k
This article is contributed by Rishabh. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Approach#2: Using linear search
The approach of this code is linear search. It iterates through the array and checks if the current element is equal to the target element. If the target element is found, it returns the index of that element. If the target element is not found, it returns -1.
Algorithm
1. Traverse through the array starting from the first element.
2. Compare each element with the given element x.
3. If the element is found, return its index.
4. If the end of array is reached and the element is not found, return -1
Python3
def search_element(arr, x):
n = len (arr)
for i in range (n):
if arr[i] = = x:
return i
return - 1
arr = [ 8 , 7 , 6 , 7 , 6 , 5 , 4 , 3 , 2 , 3 , 4 , 3 ]
x = 3
print (search_element(arr, x))
|
Javascript
function search_element(arr, x) {
let n = arr.length;
for (let i = 0; i < n; i++) {
if (arr[i] == x) {
return i;
}
}
return -1;
}
let arr = [8, 7, 6, 7, 6, 5, 4, 3, 2, 3, 4, 3];
let x = 3;
console.log(search_element(arr, x));
|
C++
#include <iostream>
using namespace std;
int search_element( int arr[], int n, int x)
{
for ( int i = 0; i < n; i++) {
if (arr[i] == x) {
return i;
}
}
return -1;
}
int main()
{
int arr[] = { 8, 7, 6, 7, 6, 5, 4, 3, 2, 3, 4, 3 };
int x = 3;
int n = sizeof (arr) / sizeof (arr[0]);
cout << search_element(arr, n, x) << endl;
return 0;
}
|
Time Complexity: O(n) where n is the length of the array.
Auxiliary Space: O(1)
Please Login to comment...