Floor in a Sorted Array

Easy Binary Search Bisect Original on GeeksforGeeks

Floor in a Sorted Array is a easy binary search problem solved with the bisect pattern. The best approach, optimal (bisect_right - 1), runs in O(log n) time and O(1) space. Below are 2 approaches in Java, from linear scan up.

Problem

Given a sorted array and a value x, return the index of the floor of x: the largest element that is less than or equal to x. If none exists, return -1.

Examples

Example 1

Input
arr = [1, 2, 8, 10, 10, 12, 19], x = 5
Output
1
Why
The largest value <= 5 is 2, at index 1.

Example 2

Input
arr = [1, 2, 8], x = 0
Output
-1

Constraints

  • 1 <= arr.length <= 10^6, sorted non-decreasing.
  • With duplicates, return the last index of the floor value.

Animated walkthrough

A narrated, step-by-step animation that builds the solution from the idea up. Press play, or step through it at your own pace.

Concepts first, then the problem and every approach, step by step.

Space to play or pause · ← → to jump a step · click or drag the bar to seek

Solutions

Try it yourself first. Then compare: each approach lists its idea, the steps, its time and space, and the Java code.

ApproachTimeSpace
Linear scanO(n)O(1)
Optimal (bisect_right - 1)O(log n)O(1)

1Linear scan

TimeO(n)
SpaceO(1)

Keep the last index whose value is at most x.

  1. Walk while arr[i] <= x; answer i - 1.
Java
class Solution {
    public int findFloor(int[] arr, int x) {
        int i = 0;
        while (i < arr.length && arr[i] <= x) i++;
        return i - 1;
    }
}

2Optimal (bisect_right - 1)

TimeO(log n)
SpaceO(1)

bisect_right(x) is the first index with a value greater than x, so the index just before it holds the largest value <= x, or -1 if there is none.

  1. Find the first index with arr[i] > x.
  2. Return that index - 1.
Java
class Solution {
    public int findFloor(int[] arr, int x) {
        int lo = 0, hi = arr.length;
        while (lo < hi) {
            int mid = (lo + hi) >>> 1;
            if (arr[mid] > x) hi = mid; else lo = mid + 1;
        }
        return lo - 1;
    }
}

Edge cases to test

  • x smaller than every element (-1)
  • x equal to a repeated value (last occurrence)

Hints

Hint 1

The floor is at bisect_right(x) - 1.

FAQ

What is the best time complexity for Floor in a Sorted Array?

Optimal (bisect_right - 1) runs in O(log n) time and O(1) extra space.

Which pattern does Floor in a Sorted Array use?

It is a binary search problem that uses the bisect pattern. Other problems with the same pattern: bisect_left, bisect_right, Search Insert Position, Ceil in a Sorted Array.

Is there a brute force solution for Floor in a Sorted Array?

Yes. Linear scan takes O(n) time and O(1) space. Keep the last index whose value is at most x.

Which edge cases should I test for Floor in a Sorted Array?

x smaller than every element (-1); x equal to a repeated value (last occurrence).