Given an unsorted array arr[] and an element x, find floor and ceiling of x in arr[0..n-1].
Floor of x is the largest element which is smaller than or equal to x. Floor of x doesn’t exist if x is smaller than smallest element of arr[].
Ceil of x is the smallest element which is greater than or equal to x. Ceil of x doesn’t exist if x is greater than greates element of arr[].
Examples:
Input : arr[] = {5, 6, 8, 9, 6, 5, 5, 6}
x = 7
Output : Floor = 6
Ceiling = 8
Input : arr[] = {5, 6, 8, 9, 6, 5, 5, 6}
x = 6
Output : Floor = 6
Ceiling = 6
Input : arr[] = {5, 6, 8, 9, 6, 5, 5, 6}
x = 10
Output : Floor = 9
Ceiling doesn't exist.
Method 1 (Use Sorting)
1) Sort input array.
2) Use binary search to find floor and ceiling of x. Refer this and this for implementation of floor and ceiling in a sorted array.
Time Complexity : O(n log n)
Auxiliary Space : O(1)
This solution is works well if there are multiple queries of floor and ceiling on a static array. We can sort the array once and answer the queries in O(Log n) time.
Method 2 (Use Linear Search
The idea is to traverse array and keep track of two distances with respect to x.
1) Minimum distance of element greater than or equal to x.
2) Minimum distance of element smaller than or equal to x.
Finally print elements with minimum distances.
C++
#include<bits/stdc++.h>
using namespace std;
void floorAndCeil( int arr[], int n, int x)
{
int fInd, cInd;
int fDist = INT_MAX, cDist = INT_MAX;
for ( int i=0; i<n; i++)
{
if (arr[i] >= x && cDist > (arr[i] - x))
{
cInd = i;
cDist = arr[i] - x;
}
if (arr[i] <= x && fDist > (x - arr[i]))
{
fInd = i;
fDist = x - arr[i];
}
}
if (fDist == INT_MAX)
cout << "Floor doesn't exist " << endl;
else
cout << "Floor is " << arr[fInd] << endl;
if (cDist == INT_MAX)
cout << "Ceil doesn't exist " << endl;
else
cout << "Ceil is " << arr[cInd] << endl;
}
int main()
{
int arr[] = {5, 6, 8, 9, 6, 5, 5, 6};
int n = sizeof (arr)/ sizeof ( int );
int x = 7;
floorAndCeil(arr, n, x);
return 0;
}
|
Java
import java.io.*;
class GFG
{
public static void floorAndCeil( int arr[], int x)
{
int n = arr.length;
int fInd = - 1 , cInd = - 1 ;
int fDist = Integer.MAX_VALUE, cDist = Integer.MAX_VALUE;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] >= x && cDist > (arr[i] - x))
{
cInd = i;
cDist = arr[i] - x;
}
if (arr[i] <= x && fDist > (x - arr[i]))
{
fInd = i;
fDist = x - arr[i];
}
}
if (fDist == Integer.MAX_VALUE)
System.out.println( "Floor doesn't exist " );
else
System.out.println( "Floor is " + arr[fInd]);
if (cDist == Integer.MAX_VALUE)
System.out.println( "Ceil doesn't exist " );
else
System.out.println( "Ceil is " + arr[cInd]);
}
public static void main (String[] args)
{
int arr[] = { 5 , 6 , 8 , 9 , 6 , 5 , 5 , 6 };
int x = 7 ;
floorAndCeil(arr, x);
}
}
|
Python 3
import sys
def floorAndCeil(arr, n, x):
fDist = sys.maxsize
cDist = sys.maxsize
for i in range (n):
if (arr[i] > = x and
cDist > (arr[i] - x)):
cInd = i
cDist = arr[i] - x
if (arr[i] < = x and fDist > (x - arr[i])):
fInd = i
fDist = x - arr[i]
if (fDist = = sys.maxsize):
print ( "Floor doesn't exist " )
else :
print ( "Floor is " + str (arr[fInd]))
if (cDist = = sys.maxsize):
print ( "Ceil doesn't exist " )
else :
print ( "Ceil is " + str (arr[cInd]))
if __name__ = = "__main__" :
arr = [ 5 , 6 , 8 , 9 , 6 , 5 , 5 , 6 ]
n = len (arr)
x = 7
floorAndCeil(arr, n, x)
|
C#
using System;
class GFG {
public static void floorAndCeil( int []arr, int x)
{
int n = arr.Length;
int fInd = -1, cInd = -1;
int fDist = int .MaxValue,
cDist = int .MaxValue;
for ( int i = 0; i < n; i++)
{
if (arr[i] >= x && cDist > (arr[i] - x))
{
cInd = i;
cDist = arr[i] - x;
}
if (arr[i] <= x && fDist > (x - arr[i]))
{
fInd = i;
fDist = x - arr[i];
}
}
if (fDist == int .MaxValue)
Console.Write( "Floor doesn't exist " );
else
Console.WriteLine( "Floor is " + arr[fInd]);
if (cDist == int .MaxValue)
Console.Write( "Ceil doesn't exist " );
else
Console.Write( "Ceil is " + arr[cInd]);
}
public static void Main ()
{
int []arr = {5, 6, 8, 9, 6, 5, 5, 6};
int x = 7;
floorAndCeil(arr, x);
}
}
|
PHP
<?php
function floorAndCeil( $arr ,
$n , $x )
{
$fInd = 0;
$cInd = 0;
$fDist = 999999;
$cDist = 999999;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $arr [ $i ] >= $x &&
$cDist > ( $arr [ $i ] - $x ))
{
$cInd = $i ;
$cDist = $arr [ $i ] - $x ;
}
if ( $arr [ $i ] <= $x &&
$fDist > ( $x - $arr [ $i ]))
{
$fInd = $i ;
$fDist = $x - $arr [ $i ];
}
}
if ( $fDist == 999999)
echo "Floor doesn't " .
"exist " . "\n" ;
else
echo "Floor is " .
$arr [ $fInd ] . "\n" ;
if ( $cDist == 999999)
echo "Ceil doesn't " .
"exist " . "\n" ;
else
echo "Ceil is " .
$arr [ $cInd ] . "\n" ;
}
$arr = array (5, 6, 8, 9,
6, 5, 5, 6);
$n = count ( $arr );
$x = 7;
floorAndCeil( $arr , $n , $x );
?>
|
Javascript
<script>
function floorAndCeil(arr,x)
{
let n = arr.length;
let fInd = -1, cInd = -1;
let fDist = Number.MAX_VALUE, cDist = Number.MAX_VALUE;
for (let i = 0; i < n; i++)
{
if (arr[i] >= x && cDist > (arr[i] - x))
{
cInd = i;
cDist = arr[i] - x;
}
if (arr[i] <= x && fDist > (x - arr[i]))
{
fInd = i;
fDist = x - arr[i];
}
}
if (fDist == Number.MAX_VALUE)
document.write( "Floor doesn't exist <br>" );
else
document.write( "Floor is " + arr[fInd]+ "<br>" );
if (cDist == Number.MAX_VALUE)
document.write( "Ceil doesn't exist <br>" );
else
document.write( "Ceil is " + arr[cInd]+ "<br>" );
}
let arr=[5, 6, 8, 9, 6, 5, 5, 6];
let x = 7;
floorAndCeil(arr, x);
</script>
|
Output :
Floor is 6
Ceil is 8
Time Complexity : O(n)
Auxiliary Space : O(1)
Related Articles :
Ceiling in a sorted array
Floor in a sorted array
This article is contributed by DANISH_RAZA. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.