Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Break down a hard problem into reliable checkpoints, edge-case handling, and complexity trade-offs.
You are given a 0-indexed 2D integer array flowers, where flowers[i] = [starti, endi] means the ith flower will be in full bloom from starti to endi (inclusive). You are also given a 0-indexed integer array people of size n, where people[i] is the time that the ith person will arrive to see the flowers.
Return an integer array answer of size n, where answer[i] is the number of flowers that are in full bloom when the ith person arrives.
Example 1:
Input: flowers = [[1,6],[3,7],[9,12],[4,13]], people = [2,3,7,11] Output: [1,2,2,2] Explanation: The figure above shows the times when the flowers are in full bloom and when the people arrive. For each person, we return the number of flowers in full bloom during their arrival.
Example 2:
Input: flowers = [[1,10],[3,3]], people = [3,3,2] Output: [2,2,1] Explanation: The figure above shows the times when the flowers are in full bloom and when the people arrive. For each person, we return the number of flowers in full bloom during their arrival.
Constraints:
1 <= flowers.length <= 5 * 104flowers[i].length == 21 <= starti <= endi <= 1091 <= people.length <= 5 * 1041 <= people[i] <= 109Problem summary: You are given a 0-indexed 2D integer array flowers, where flowers[i] = [starti, endi] means the ith flower will be in full bloom from starti to endi (inclusive). You are also given a 0-indexed integer array people of size n, where people[i] is the time that the ith person will arrive to see the flowers. Return an integer array answer of size n, where answer[i] is the number of flowers that are in full bloom when the ith person arrives.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Hash Map · Binary Search · Segment Tree
[[1,6],[3,7],[9,12],[4,13]] [2,3,7,11]
[[1,10],[3,3]] [3,3,2]
meeting-rooms-ii)minimum-interval-to-include-each-query)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2251: Number of Flowers in Full Bloom
class Solution {
public int[] fullBloomFlowers(int[][] flowers, int[] people) {
int n = flowers.length;
int[] start = new int[n];
int[] end = new int[n];
for (int i = 0; i < n; ++i) {
start[i] = flowers[i][0];
end[i] = flowers[i][1];
}
Arrays.sort(start);
Arrays.sort(end);
int m = people.length;
int[] ans = new int[m];
for (int i = 0; i < m; ++i) {
ans[i] = search(start, people[i] + 1) - search(end, people[i]);
}
return ans;
}
private int search(int[] nums, int x) {
int l = 0, r = nums.length;
while (l < r) {
int mid = (l + r) >> 1;
if (nums[mid] >= x) {
r = mid;
} else {
l = mid + 1;
}
}
return l;
}
}
// Accepted solution for LeetCode #2251: Number of Flowers in Full Bloom
func fullBloomFlowers(flowers [][]int, people []int) (ans []int) {
n := len(flowers)
start := make([]int, n)
end := make([]int, n)
for i, f := range flowers {
start[i] = f[0]
end[i] = f[1]
}
sort.Ints(start)
sort.Ints(end)
for _, p := range people {
r := sort.SearchInts(start, p+1)
l := sort.SearchInts(end, p)
ans = append(ans, r-l)
}
return
}
# Accepted solution for LeetCode #2251: Number of Flowers in Full Bloom
class Solution:
def fullBloomFlowers(
self, flowers: List[List[int]], people: List[int]
) -> List[int]:
start, end = sorted(a for a, _ in flowers), sorted(b for _, b in flowers)
return [bisect_right(start, p) - bisect_left(end, p) for p in people]
// Accepted solution for LeetCode #2251: Number of Flowers in Full Bloom
use std::collections::BTreeMap;
impl Solution {
#[allow(dead_code)]
pub fn full_bloom_flowers(flowers: Vec<Vec<i32>>, people: Vec<i32>) -> Vec<i32> {
let n = people.len();
// First sort the people vector based on the first item
let mut people: Vec<(usize, i32)> = people.into_iter().enumerate().map(|x| x).collect();
people.sort_by(|lhs, rhs| lhs.1.cmp(&rhs.1));
// Initialize the difference vector
let mut diff = BTreeMap::new();
let mut ret = vec![0; n];
for f in flowers {
let (left, right) = (f[0], f[1]);
diff.entry(left)
.and_modify(|x| {
*x += 1;
})
.or_insert(1);
diff.entry(right + 1)
.and_modify(|x| {
*x -= 1;
})
.or_insert(-1);
}
let mut sum = 0;
let mut i = 0;
for (k, v) in diff {
while i < n && people[i].1 < k {
ret[people[i].0] += sum;
i += 1;
}
sum += v;
}
ret
}
}
// Accepted solution for LeetCode #2251: Number of Flowers in Full Bloom
function fullBloomFlowers(flowers: number[][], people: number[]): number[] {
const n = flowers.length;
const start = new Array(n).fill(0);
const end = new Array(n).fill(0);
for (let i = 0; i < n; ++i) {
start[i] = flowers[i][0];
end[i] = flowers[i][1];
}
start.sort((a, b) => a - b);
end.sort((a, b) => a - b);
const ans: number[] = [];
for (const p of people) {
const r = search(start, p + 1);
const l = search(end, p);
ans.push(r - l);
}
return ans;
}
function search(nums: number[], x: number): number {
let l = 0;
let r = nums.length;
while (l < r) {
const mid = (l + r) >> 1;
if (nums[mid] >= x) {
r = mid;
} else {
l = mid + 1;
}
}
return l;
}
Use this to step through a reusable interview workflow for this problem.
Check every element from left to right until we find the target or exhaust the array. Each comparison is O(1), and we may visit all n elements, giving O(n). No extra space needed.
Each comparison eliminates half the remaining search space. After k comparisons, the space is n/2ᵏ. We stop when the space is 1, so k = log₂ n. No extra memory needed — just two pointers (lo, hi).
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Zero-count keys stay in map and break distinct/count constraints.
Usually fails on: Window/map size checks are consistently off by one.
Fix: Delete keys when count reaches zero.
Wrong move: Setting `lo = mid` or `hi = mid` can stall and create an infinite loop.
Usually fails on: Two-element ranges never converge.
Fix: Use `lo = mid + 1` or `hi = mid - 1` where appropriate.