 Open in App
Not now

# Floor in a Sorted Array

• Difficulty Level : Easy
• Last Updated : 30 Oct, 2022

Given a sorted array and a value x, the floor of x is the largest element in the array smaller than or equal to x. Write efficient functions to find the floor of x

Examples:

Input: arr[] = {1, 2, 8, 10, 10, 12, 19}, x = 5
Output: 2
Explanation: 2 is the largest element in
arr[] smaller than 5

Input: arr[] = {1, 2, 8, 10, 10, 12, 19}, x = 20
Output: 19
Explanation: 19 is the largest element in
arr[] smaller than 20

Input : arr[] = {1, 2, 8, 10, 10, 12, 19}, x = 0
Output : -1
Explanation: Since floor doesn’t exist, output is -1.

Recommended Practice

Naive Approach: To solve the problem follow the below idea:

The idea is simple, traverse through the array and find the first element greater than x. The element just before the found element is the floor of x

Follow the given steps to solve the problem:

• Traverse through the array from start to end.
• If the current element is greater than x print the previous number and break out of the loop
• If there is no number greater than x then print the last element
• If the first number is greater than x then print that the floor of x doesn’t exist

Below is the implementation of the above approach:

## C++

 `// C++ program to find floor of a given number` `// in a sorted array` `#include ` `using` `namespace` `std;`   `/* An inefficient function to get` `index of floor of x in arr[0..n-1] */` `int` `floorSearch(``int` `arr[], ``int` `n, ``int` `x)` `{` `    ``// If last element is smaller than x` `    ``if` `(x >= arr[n - 1])` `        ``return` `n - 1;`   `    ``// If first element is greater than x` `    ``if` `(x < arr)` `        ``return` `-1;`   `    ``// Linearly search for the first element` `    ``// greater than x` `    ``for` `(``int` `i = 1; i < n; i++)` `        ``if` `(arr[i] > x)` `            ``return` `(i - 1);`   `    ``return` `-1;` `}`   `/* Driver program to check above functions */` `int` `main()` `{` `    ``int` `arr[] = { 1, 2, 4, 6, 10, 12, 14 };` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);` `    ``int` `x = 7;` `    ``int` `index = floorSearch(arr, n - 1, x);` `    ``if` `(index == -1)` `        ``cout << ``"Floor of "` `<< x` `             ``<< ``" doesn't exist in array "``;` `    ``else` `        ``cout << ``"Floor of "` `<< x << ``" is "` `<< arr[index];` `    ``return` `0;` `}`   `// This code is contributed by shivanisinghss2110`

## C

 `// C/C++ program to find floor of a given number` `// in a sorted array` `#include `   `/* An inefficient function to get` `index of floor of x in arr[0..n-1] */` `int` `floorSearch(``int` `arr[], ``int` `n, ``int` `x)` `{` `    ``// If last element is smaller than x` `    ``if` `(x >= arr[n - 1])` `        ``return` `n - 1;`   `    ``// If first element is greater than x` `    ``if` `(x < arr)` `        ``return` `-1;`   `    ``// Linearly search for the first element` `    ``// greater than x` `    ``for` `(``int` `i = 1; i < n; i++)` `        ``if` `(arr[i] > x)` `            ``return` `(i - 1);`   `    ``return` `-1;` `}`   `/* Driver program to check above functions */` `int` `main()` `{` `    ``int` `arr[] = { 1, 2, 4, 6, 10, 12, 14 };` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);` `    ``int` `x = 7;` `    ``int` `index = floorSearch(arr, n - 1, x);` `    ``if` `(index == -1)` `        ``printf``(``"Floor of %d doesn't exist in array "``, x);` `    ``else` `        ``printf``(``"Floor of %d is %d"``, x, arr[index]);` `    ``return` `0;` `}`

## Java

 `// Java program to find floor of` `// a given number in a sorted array` `import` `java.io.*;` `import` `java.lang.*;` `import` `java.util.*;`   `class` `GFG {`   `    ``/* An inefficient function to get index of floor` `of x in arr[0..n-1] */` `    ``static` `int` `floorSearch(``int` `arr[], ``int` `n, ``int` `x)` `    ``{` `        ``// If last element is smaller than x` `        ``if` `(x >= arr[n - ``1``])` `            ``return` `n - ``1``;`   `        ``// If first element is greater than x` `        ``if` `(x < arr[``0``])` `            ``return` `-``1``;`   `        ``// Linearly search for the first element` `        ``// greater than x` `        ``for` `(``int` `i = ``1``; i < n; i++)` `            ``if` `(arr[i] > x)` `                ``return` `(i - ``1``);`   `        ``return` `-``1``;` `    ``}`   `    ``// Driver Code` `    ``public` `static` `void` `main(String[] args)` `    ``{` `        ``int` `arr[] = { ``1``, ``2``, ``4``, ``6``, ``10``, ``12``, ``14` `};` `        ``int` `n = arr.length;` `        ``int` `x = ``7``;` `        ``int` `index = floorSearch(arr, n - ``1``, x);` `        ``if` `(index == -``1``)` `            ``System.out.print(``"Floor of "` `+ x` `                             ``+ ``" doesn't exist in array "``);` `        ``else` `            ``System.out.print(``"Floor of "` `+ x + ``" is "` `                             ``+ arr[index]);` `    ``}` `}`   `// This code is contributed` `// by Akanksha Rai(Abby_akku)`

## Python3

 `# Python3 program to find floor of a` `# given number in a sorted array`   `# Function to get index of floor` `# of x in arr[low..high]`     `def` `floorSearch(arr, n, x):` `    ``# If last element is smaller than x` `    ``if` `(x >``=` `arr[n ``-` `1``]):` `        ``return` `n ``-` `1`   `    ``# If first element is greater than x` `    ``if` `(x < arr[``0``]):` `        ``return` `-``1`   `    ``# Linearly search for the first element` `    ``# greater than x` `    ``for` `i ``in` `range``(``1``, n):` `        ``if` `(arr[i] > x):` `            ``return` `(i ``-` `1``)`   `    ``return` `-``1`     `# Driver Code` `arr ``=` `[``1``, ``2``, ``4``, ``6``, ``10``, ``12``, ``14``]` `n ``=` `len``(arr)` `x ``=` `7` `index ``=` `floorSearch(arr, n``-``1``, x)`   `if` `(index ``=``=` `-``1``):` `    ``print``(``"Floor of"``, x, "doesn't exist \` `                    ``in` `array ``", end="``")` `else``:` `    ``print``(``"Floor of"``, x, ``"is"``, arr[index])`   `# This code is contributed by Smitha Dinesh Semwal.`

## C#

 `// C# program to find floor of a given number` `// in a sorted array` `using` `System;`   `class` `GFG {`   `    ``/* An inefficient function to get index of floor` `of x in arr[0..n-1] */` `    ``static` `int` `floorSearch(``int``[] arr, ``int` `n, ``int` `x)` `    ``{` `        ``// If last element is smaller than x` `        ``if` `(x >= arr[n - 1])` `            ``return` `n - 1;`   `        ``// If first element is greater than x` `        ``if` `(x < arr)` `            ``return` `-1;`   `        ``// Linearly search for the first element` `        ``// greater than x` `        ``for` `(``int` `i = 1; i < n; i++)` `            ``if` `(arr[i] > x)` `                ``return` `(i - 1);`   `        ``return` `-1;` `    ``}`   `    ``// Driver Code` `    ``static` `void` `Main()` `    ``{` `        ``int``[] arr = { 1, 2, 4, 6, 10, 12, 14 };` `        ``int` `n = arr.Length;` `        ``int` `x = 7;` `        ``int` `index = floorSearch(arr, n - 1, x);` `        ``if` `(index == -1)` `            ``Console.WriteLine(``"Floor of "` `+ x` `                              ``+ ``" doesn't exist in array "``);` `        ``else` `            ``Console.WriteLine(``"Floor of "` `+ x + ``" is "` `                              ``+ arr[index]);` `    ``}` `}`   `// This code is contributed` `// by mits`

## PHP

 `= ``\$arr``[``\$n` `- 1]) ` `        ``return` `\$n` `- 1; `   `    ``// If first element is greater` `    ``// than x ` `    ``if` `(``\$x` `< ``\$arr``) ` `        ``return` `-1; `   `    ``// Linearly search for the ` `    ``// first element greater than x ` `    ``for` `(``\$i` `= 1; ``\$i` `< ``\$n``; ``\$i``++) ` `    ``if` `(``\$arr``[``\$i``] > ``\$x``) ` `        ``return` `(``\$i` `- 1); `   `    ``return` `-1; ` `} `   `// Driver Code` `\$arr` `= ``array` `(1, 2, 4, 6, 10, 12, 14); ` `\$n` `= sizeof(``\$arr``); ` `\$x` `= 7; ` `\$index` `= floorSearch(``\$arr``, ``\$n` `- 1, ``\$x``); ` `if` `(``\$index` `== -1) ` `    ``echo` `"Floor of "``, ``\$x``, ` `         ``"doesn't exist in array "``; ` `else` `    ``echo` `"Floor of "``, ``\$x``,` `         ``" is "``, ``\$arr``[``\$index``]; ` `    `  `// This code is contributed by ajit` `?>`

## Javascript

 ``

Output

`Floor of 7 is 6`

Time Complexity: O(N). To traverse an array only one loop is needed.
Auxiliary Space: O(1). No extra space is required

## Floor in a Sorted Array using binary search:

To solve the problem follow the below idea:

There is a catch in the problem, the given array is sorted. The idea is to use Binary Search to find the floor of a number x in a sorted array by comparing it to the middle element and dividing the search space into half

Follow the given steps to solve the problem:

• The algorithm can be implemented recursively or through iteration, but the basic idea remains the same.
• There are some base cases to handle
• If there is no number greater than x then print the last element
• If the first number is greater than x then print -1
• create three variables low = 0, mid and high = n-1 and another variable to store the answer
• Run a loop or recurse until and unless low is less than or equal to high.
• check if the middle ( (low + high) /2) element is less than x, if yes then update the low, i.e low = mid + 1, and update the answer with the middle element. In this step we are reducing the search space to half.
• Else update the high , i.e high = mid – 1

Below is the implementation of the above approach:

## C++

 `// A C/C++ program to find floor` `// of a given number in a sorted array` `#include ` `using` `namespace` `std;`   `/* Function to get index of floor of x in` `   ``arr[low..high] */` `int` `floorSearch(``int` `arr[], ``int` `low, ``int` `high, ``int` `x)` `{` `    ``// If low and high cross each other` `    ``if` `(low > high)` `        ``return` `-1;`   `    ``// If last element is smaller than x` `    ``if` `(x >= arr[high])` `        ``return` `high;`   `    ``// Find the middle point` `    ``int` `mid = (low + high) / 2;`   `    ``// If middle point is floor.` `    ``if` `(arr[mid] == x)` `        ``return` `mid;`   `    ``// If x lies between mid-1 and mid` `    ``if` `(mid > 0 && arr[mid - 1] <= x && x < arr[mid])` `        ``return` `mid - 1;`   `    ``// If x is smaller than mid, floor` `    ``// must be in left half.` `    ``if` `(x < arr[mid])` `        ``return` `floorSearch(arr, low, mid - 1, x);`   `    ``// If mid-1 is not floor and x is` `    ``// greater than arr[mid],` `    ``return` `floorSearch(arr, mid + 1, high, x);` `}`   `// Driver code` `int` `main()` `{` `    ``int` `arr[] = { 1, 2, 4, 6, 10, 12, 14 };` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);` `    ``int` `x = 7;`   `    ``// Function call` `    ``int` `index = floorSearch(arr, 0, n - 1, x);` `    ``if` `(index == -1)` `        ``cout << ``"Floor of "` `<< x` `             ``<< ``" doesn't exist in array "``;` `    ``else` `        ``cout << ``"Floor of "` `<< x << ``" is "` `<< arr[index];` `    ``return` `0;` `}`   `// this code is contributed by shivanisinghss2110`

## C

 `// A C/C++ program to find floor` `// of a given number in a sorted array` `#include `   `/* Function to get index of floor of x in` `   ``arr[low..high] */` `int` `floorSearch(``int` `arr[], ``int` `low, ``int` `high, ``int` `x)` `{` `    ``// If low and high cross each other` `    ``if` `(low > high)` `        ``return` `-1;`   `    ``// If last element is smaller than x` `    ``if` `(x >= arr[high])` `        ``return` `high;`   `    ``// Find the middle point` `    ``int` `mid = (low + high) / 2;`   `    ``// If middle point is floor.` `    ``if` `(arr[mid] == x)` `        ``return` `mid;`   `    ``// If x lies between mid-1 and mid` `    ``if` `(mid > 0 && arr[mid - 1] <= x && x < arr[mid])` `        ``return` `mid - 1;`   `    ``// If x is smaller than mid, floor` `    ``// must be in left half.` `    ``if` `(x < arr[mid])` `        ``return` `floorSearch(arr, low, mid - 1, x);`   `    ``// If mid-1 is not floor and x is` `    ``// greater than arr[mid],` `    ``return` `floorSearch(arr, mid + 1, high, x);` `}`   `// Driver code` `int` `main()` `{` `    ``int` `arr[] = { 1, 2, 4, 6, 10, 12, 14 };` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);` `    ``int` `x = 7;`   `    ``// Function call` `    ``int` `index = floorSearch(arr, 0, n - 1, x);` `    ``if` `(index == -1)` `        ``printf``(``"Floor of %d doesn't exist in array "``, x);` `    ``else` `        ``printf``(``"Floor of %d is %d"``, x, arr[index]);` `    ``return` `0;` `}`

## Java

 `// Java program to find floor of` `// a given number in a sorted array` `import` `java.io.*;`   `class` `GFG {`   `    ``/* Function to get index of floor of x in` `    ``arr[low..high] */` `    ``static` `int` `floorSearch(``int` `arr[], ``int` `low, ``int` `high,` `                           ``int` `x)` `    ``{` `        ``// If low and high cross each other` `        ``if` `(low > high)` `            ``return` `-``1``;`   `        ``// If last element is smaller than x` `        ``if` `(x >= arr[high])` `            ``return` `high;`   `        ``// Find the middle point` `        ``int` `mid = (low + high) / ``2``;`   `        ``// If middle point is floor.` `        ``if` `(arr[mid] == x)` `            ``return` `mid;`   `        ``// If x lies between mid-1 and mid` `        ``if` `(mid > ``0` `&& arr[mid - ``1``] <= x && x < arr[mid])` `            ``return` `mid - ``1``;`   `        ``// If x is smaller than mid, floor` `        ``// must be in left half.` `        ``if` `(x < arr[mid])` `            ``return` `floorSearch(arr, low, mid - ``1``, x);`   `        ``// If mid-1 is not floor and x is` `        ``// greater than arr[mid],` `        ``return` `floorSearch(arr, mid + ``1``, high, x);` `    ``}`   `    ``// Driver code` `    ``public` `static` `void` `main(String[] args)` `    ``{` `        ``int` `arr[] = { ``1``, ``2``, ``4``, ``6``, ``10``, ``12``, ``14` `};` `        ``int` `n = arr.length;` `        ``int` `x = ``7``;`   `        ``// Function call` `        ``int` `index = floorSearch(arr, ``0``, n - ``1``, x);` `        ``if` `(index == -``1``)` `            ``System.out.println(` `                ``"Floor of "` `+ x` `                ``+ ``" doesn't exist in array "``);` `        ``else` `            ``System.out.println(``"Floor of "` `+ x + ``" is "` `                               ``+ arr[index]);` `    ``}` `}` `// This code is contributed by Prerna Saini`

## Python3

 `# Python3 program to find floor of a` `# given number in a sorted array`   `# Function to get index of floor` `# of x in arr[low..high]`     `def` `floorSearch(arr, low, high, x):`   `    ``# If low and high cross each other` `    ``if` `(low > high):` `        ``return` `-``1`   `    ``# If last element is smaller than x` `    ``if` `(x >``=` `arr[high]):` `        ``return` `high`   `    ``# Find the middle point` `    ``mid ``=` `int``((low ``+` `high) ``/` `2``)`   `    ``# If middle point is floor.` `    ``if` `(arr[mid] ``=``=` `x):` `        ``return` `mid`   `    ``# If x lies between mid-1 and mid` `    ``if` `(mid > ``0` `and` `arr[mid``-``1``] <``=` `x` `            ``and` `x < arr[mid]):` `        ``return` `mid ``-` `1`   `    ``# If x is smaller than mid,` `    ``# floor must be in left half.` `    ``if` `(x < arr[mid]):` `        ``return` `floorSearch(arr, low, mid``-``1``, x)`   `    ``# If mid-1 is not floor and x is greater than` `    ``# arr[mid],` `    ``return` `floorSearch(arr, mid ``+` `1``, high, x)`     `# Driver Code` `if` `__name__ ``=``=` `"__main__"``:` `    ``arr ``=` `[``1``, ``2``, ``4``, ``6``, ``10``, ``12``, ``14``]` `    ``n ``=` `len``(arr)` `    ``x ``=` `7`   `    ``# Function call` `    ``index ``=` `floorSearch(arr, ``0``, n``-``1``, x)`   `    ``if` `(index ``=``=` `-``1``):` `        ``print``(``"Floor of"``, x, "doesn't exist\` `                      ``in` `array ``", end="``")` `    ``else``:` `        ``print``(``"Floor of"``, x, ``"is"``, arr[index])`   `# This code is contributed by Smitha Dinesh Semwal.`

## C#

 `// C# program to find floor of` `// a given number in a sorted array` `using` `System;`   `class` `GFG {`   `    ``/* Function to get index of floor of x in` `    ``arr[low..high] */` `    ``static` `int` `floorSearch(``int``[] arr, ``int` `low, ``int` `high,` `                           ``int` `x)` `    ``{`   `        ``// If low and high cross each other` `        ``if` `(low > high)` `            ``return` `-1;`   `        ``// If last element is smaller than x` `        ``if` `(x >= arr[high])` `            ``return` `high;`   `        ``// Find the middle point` `        ``int` `mid = (low + high) / 2;`   `        ``// If middle point is floor.` `        ``if` `(arr[mid] == x)` `            ``return` `mid;`   `        ``// If x lies between mid-1 and mid` `        ``if` `(mid > 0 && arr[mid - 1] <= x && x < arr[mid])` `            ``return` `mid - 1;`   `        ``// If x is smaller than mid, floor` `        ``// must be in left half.` `        ``if` `(x < arr[mid])` `            ``return` `floorSearch(arr, low, mid - 1, x);`   `        ``// If mid-1 is not floor and x is` `        ``// greater than arr[mid],` `        ``return` `floorSearch(arr, mid + 1, high, x);` `    ``}`   `    ``// Driver code` `    ``public` `static` `void` `Main()` `    ``{` `        ``int``[] arr = { 1, 2, 4, 6, 10, 12, 14 };` `        ``int` `n = arr.Length;` `        ``int` `x = 7;`   `        ``// Function call` `        ``int` `index = floorSearch(arr, 0, n - 1, x);` `        ``if` `(index == -1)` `            ``Console.Write(``"Floor of "` `+ x` `                          ``+ ``" doesn't exist in array "``);` `        ``else` `            ``Console.Write(``"Floor of "` `+ x + ``" is "` `                          ``+ arr[index]);` `    ``}` `}`   `// This code is contributed by nitin mittal.`

## Javascript

 ``

Output

`Floor of 7 is 6`

Time Complexity: O(log N). To run a binary search.
Auxiliary Space: O(1). As no extra space is required.

This article is contributed by Mayank Agrawal. 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.