package main
import (
"fmt"
)
func floorAndCeil(arr []int, target int) (int, int) {
floor, ceil := -1, -1
low, high := 0, len(arr)-1
for low <= high {
mid := low + (high-low)/2
if arr[mid] == target {
return arr[mid], arr[mid] // exact match is both floor and ceil
} else if arr[mid] < target {
floor = arr[mid] // update floor candidate
low = mid + 1 // search right half
} else {
ceil = arr[mid] // update ceil candidate
high = mid - 1 // search left half
}
}
return floor, ceil
}
func main() {
arr := []int{1, 3, 5, 7, 9}
target := 6
floor, ceil := floorAndCeil(arr, target)
fmt.Printf("Floor: %d\nCeil: %d\n", floor, ceil)
}
loop to narrow search range until low passes high
mid := low + (high-low)/2
calculate middle index to check
if arr[mid] == target { return arr[mid], arr[mid] }
exact match means floor and ceil are the same
else if arr[mid] < target { floor = arr[mid]; low = mid + 1 }
update floor candidate and search right half
else { ceil = arr[mid]; high = mid - 1 }
update ceil candidate and search left half