What if you could find the closest match in a huge list instantly, without checking every item?
Why Floor and Ceil in Sorted Array in DSA Rust?
Imagine you have a sorted list of prices for products, and you want to find the closest price that is just less than or equal to a customer's budget (floor), or the closest price that is just greater than or equal to it (ceil).
Doing this by checking each price one by one is slow and frustrating, especially if the list is very long.
Manually scanning the list means looking at every price until you find the right one. This takes a lot of time if the list is big.
It's easy to make mistakes, like missing the closest price or going past it.
This slow and error-prone method wastes time and can annoy customers waiting for answers.
Using the floor and ceil concept with a sorted array lets you quickly jump to the closest prices without checking every single one.
This method uses smart searching to find the exact spot where the budget fits, making the process fast and reliable.
let mut floor = None; for &price in prices.iter() { if price <= budget { floor = Some(price); } else { break; } }
let floor = prices.binary_search_by(|&x| x.cmp(&budget))
.map_or_else(|i| if i == 0 { None } else { Some(prices[i - 1]) }, |i| Some(prices[i]));This lets you instantly find the closest smaller or larger value in a sorted list, making your programs faster and smarter.
Online shopping sites use floor and ceil to suggest products just within or just above your budget, helping you find the best deals quickly.
Manual search is slow and error-prone for finding closest values.
Floor and ceil use smart searching in sorted arrays for speed and accuracy.
This concept helps in many real-world tasks like price matching and recommendations.
Practice
floor of a number in a sorted array?Solution
Step 1: Understand floor definition in sorted array
The floor of a number is the greatest element in the array that is less than or equal to the given number.Step 2: Compare options with definition
The greatest element less than or equal to the number matches the definition exactly, others describe ceil or incorrect concepts.Final Answer:
The greatest element less than or equal to the number -> Option CQuick Check:
Floor = greatest ≤ number [OK]
- Confusing floor with ceil
- Thinking floor is smallest element
- Ignoring equality in floor definition
Solution
Step 1: Recall Rust array syntax
Rust arrays use square brackets [] with comma-separated values.Step 2: Check each option
let arr = [1, 3, 5, 7, 9]; uses correct syntax. let arr = (1, 3, 5, 7, 9); uses tuple syntax with parentheses, let arr = {1, 3, 5, 7, 9}; uses braces resembling sets or blocks, let arr = <1, 3, 5, 7, 9>; uses angle brackets which are invalid.Final Answer:
let arr = [1, 3, 5, 7, 9]; -> Option AQuick Check:
Rust arrays use [] [OK]
- Using parentheses () for arrays
- Using braces {} which are for blocks
- Using angle brackets <> which are invalid here
arr = [2, 4, 6, 8, 10], what is the floor and ceil of 7?Solution
Step 1: Find floor of 7 in array
Floor is greatest element ≤ 7. Elements ≤ 7 are 2,4,6. Greatest is 6.Step 2: Find ceil of 7 in array
Ceil is smallest element ≥ 7. Elements ≥ 7 are 8,10. Smallest is 8.Final Answer:
Floor = 6, Ceil = 8 -> Option AQuick Check:
Floor ≤ 7 = 6, Ceil ≥ 7 = 8 [OK]
- Choosing floor or ceil outside array bounds
- Confusing floor and ceil values
- Assuming floor or ceil equals the target always
fn find_floor(arr: &[i32], target: i32) -> Option<i32> {
let mut low = 0;
let mut high = arr.len() - 1;
let mut floor = None;
while low <= high {
let mid = (low + high) / 2;
if arr[mid] == target {
return Some(arr[mid]);
} else if arr[mid] < target {
floor = Some(arr[mid]);
low = mid + 1;
} else {
high = mid - 1;
}
}
floor
}
What is the bug in this code?Solution
Step 1: Analyze initialization of high pointer
Usingarr.len() - 1causes panic if array is empty becauselen()is 0 and subtracting 1 underflows.Step 2: Check other parts of code
Other logic for binary search and floor update is correct. The main bug is unsafe initialization.Final Answer:
Using arr.len() - 1 without checking if array is empty -> Option BQuick Check:
Empty array causes panic at arr.len() - 1 [OK]
- Ignoring empty array edge case
- Assuming array always has elements
- Confusing return value with index
arr = [1, 3, 5, 7, 9]. You want to find the floor and ceil for multiple targets: [0, 4, 10]. Which Rust code snippet correctly returns a vector of tuples with floor and ceil for each target? Assume floor or ceil is None if not found.Solution
Step 1: Understand floor and ceil conditions
Floor is max element ≤ target, ceil is min element ≥ target.Step 2: Analyze each code snippet
```rust fn floor_ceil(arr: &[i32], targets: &[i32]) -> Vec<(Option<i32>, Option<i32>)> { targets.iter().map(|&t| { let floor = arr.iter().filter(|&&x| x <= t).max().copied(); let ceil = arr.iter().filter(|&&x| x >= t).min().copied(); (floor, ceil) }).collect() } ``` uses filter with ≤ and ≥, then max and min respectively, which matches floor and ceil definitions. ```rust fn floor_ceil(arr: &[i32], targets: &[i32]) -> Vec<(Option<i32>, Option<i32>)> { targets.iter().map(|&t| { let floor = arr.iter().filter(|&&x| x < t).max().copied(); let ceil = arr.iter().filter(|&&x| x > t).min().copied(); (floor, ceil) }).collect() } ``` uses < and > which exclude equality. ```rust fn floor_ceil(arr: &[i32], targets: &[i32]) -> Vec<(Option<i32>, Option<i32>)> { targets.iter().map(|&t| { let floor = arr.iter().find(|&&x| x <= t).copied(); let ceil = arr.iter().find(|&&x| x >= t).copied(); (floor, ceil) }).collect() } ``` uses find which returns first match, not max or min. ```rust fn floor_ceil(arr: &[i32], targets: &[i32]) -> Vec<(Option<i32>, Option<i32>)> { targets.iter().map(|&t| { let floor = arr.iter().filter(|&&x| x <= t).min().copied(); let ceil = arr.iter().filter(|&&x| x >= t).max().copied(); (floor, ceil) }).collect() } ``` reverses min and max causing wrong results.Final Answer:
filter(|&&x| x <= t).max() for floor, filter(|&&x| x >= t).min() for ceil -> Option DQuick Check:
Floor = max ≤ target, Ceil = min ≥ target [OK]
- Using strict < or > instead of ≤ or ≥
- Using find instead of max/min for floor/ceil
- Swapping min and max in floor/ceil logic
Ready to prove it?
Pass the test and this pattern moves unknown
