Descriptio Link to heading

2251. Number of Flowers in Full Bloom (Hard)

You are given a 0-indexed 2D integer array flowers, where flowers[i] = [startᵢ, endᵢ] means the iᵗʰ flower will be in full bloom from startᵢ to endᵢ ( inclusive). You are also given a 0-indexed integer array people of size n, where people[i] is the time that the iᵗʰ 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 iᵗʰ person arrives.

Example 1:

Input: flowers = [[1,6],[3,7],[9,12],[4,13]], poeple = [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]], poeple = [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 * 10⁴
  • flowers[i].length == 2
  • 1 <= startᵢ <= endᵢ <= 10⁹
  • 1 <= people.length <= 5 * 10⁴
  • 1 <= people[i] <= 10⁹

Solution Link to heading

Divide the flowers array into two arrays: one representing the time when flowers bloom and the other for the time when they wither, both sorted in ascending order.

Subsequently, for each query, one merely needs to determine how many flowers have bloomed by the current time and how many have withered. Given the sorted nature of these arrays, binary search can be employed for efficient implementation.

Code Link to heading

class Solution {
  public:
    int upper(vector<int> &arr, int time) {
        int l = 0, r = arr.size();
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (arr[mid] <= time) {
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l;
    }
    int lower(vector<int> &arr, int time) {
        int l = 0, r = arr.size();
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (arr[mid] < time) {
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l;
    }
    vector<int> fullBloomFlowers(vector<vector<int>> &flowers, vector<int> &people) {
        // 二分
        int n = flowers.size();
        vector<int> start(n), end(n);
        for (int i = 0; i < n; ++i) {
            start[i] = flowers[i][0];
            end[i] = flowers[i][1];
        }
        sort(start.begin(), start.end());
        sort(end.begin(), end.end());
        vector<int> ans;
        for (int time : people) {
            int res = upper(start, time) - lower(end, time);
            ans.push_back(res);
        }
        return ans;
    }
};