【LetMeFly】2251. Количество цветков в период цветения: сортировка + два балла.
Ссылка на вопрос о Leetcode: https://leetcode.cn/problems/number-of-flowers-in-full-bloom/
Вам дан двумерный целочисленный массив с индексами, начинающимися с 0flowers
, который представляет период цветения -го цветка от до (все включено ). При этом вам дан целочисленный массив с индексами, начинающимися с 0 , и размером 0 — это время, потраченное первым человеком.flowers[i] = [starti, endi]
i
starti
endi
n
persons
persons[i]
i
Пожалуйста, верните n
целочисленный массив размера , где количество цветов в период цветения, когда прибывает первый человек . answer
answer[i]
i
Пример 1:
Ввод: цветы = [[1,6],[3,7],[9,12],[4,13]], люди = [2,3,7,11] Выход: [1,2,2, 2] Пояснение: На рисунке выше показано время цветения каждого цветка и время прибытия каждого человека. Для каждой особи мы возвращаем количество цветов в период цветения, когда они появились.
Пример 2:
Ввод: цветы = [[1,10],[3,3]], люди = [3,3,2] Выход: [2,2,1] Объяснение: на рисунке выше показано время цветения каждого цветка, а Время прибытия для всех. Для каждой особи мы возвращаем количество цветов в период цветения, когда они появились.
намекать:
1 <= flowers.length <= 5 * 104
flowers[i].length == 2
1 <= starti <= endi <= 109
1 <= persons.length <= 5 * 104
1 <= persons[i] <= 109
Способ 1: сортировка + деление
Поместите все времена цветения в массив и отсортируйте их от меньшего к большему; поместите все закрытые времена цветения в массив и отсортируйте их от меньшего к большему.
На определенный момент (определенный день) количество цветущих в данный момент цветов составляет: количество цветков со временем цветения меньше или равное текущему времени - количество закрытых цветков меньше или равное текущему времени количество цветов со временем цветения меньше или равным текущему времени - количество закрытых цветков Количество цветков меньше или равное дню, предшествующему текущему времениКоличество цветов, время цветения которых меньше или равно текущему времени.−Количество закрытых цветков меньше или равно количеству цветов за день до текущего времени .
Как быстро получить неубывающий массив aaa in≤ k \leq k≤Число элементов k ? Всего два пункта. (upper_bound в C++/bisect_right в Python)
- Временная сложность O ( ( n + m ) log n ) O((n + m)\log n)О (( н+м )ло гn ) , кромеn= len (цветы) n = len (цветы)н"="l e n ( цветы ) , m = len (люди) m = len ( люди )м"="л е н ( люди ) _ _ _
- Пространственная сложность O ( n ) O(n)O ( n ) , возвращаемое значение не включено в сложность пространства алгоритма.
Код переменного тока
С++
class Solution {
public:
vector<int> fullBloomFlowers(vector<vector<int>>& flowers, vector<int>& people) {
vector<int> start(flowers.size()), end(flowers.size()), ans(people.size());
for (int i = 0; i < flowers.size(); i++) {
start[i] = flowers[i][0];
end[i] = flowers[i][1];
}
sort(start.begin(), start.end());
sort(end.begin(), end.end());
for (int i = 0; i < people.size(); i++) {
// 到这一天为止的开花总数 - 到这一天的前一天为止的闭花总数
int hanagasaku = upper_bound(start.begin(), start.end(), people[i]) - start.begin(); // 花が咲く(はながさく)
int hanagatiru = upper_bound(end.begin(), end.end(), people[i] - 1) - end.begin();// 花が散る(はながちる)
ans[i] = hanagasaku - hanagatiru;
}
return ans;
}
};
Питон
Верно и просто!
# from typing import List
# from bisect import bisect_right
class Solution:
def fullBloomFlowers(self, flowers: List[List[int]], people: List[int]) -> List[int]:
start = sorted([f[0] for f in flowers])
end = sorted([f[1] for f in flowers])
return [bisect_right(start, p) - bisect_right(end, p - 1) for p in people]
Статья одновременно публикуется на CSDN. Быть оригинальным непросто. Пожалуйста, прикрепите ссылку на оригинал статьи после перепечатки с согласия автора ~
Tisfy: https://letmefly.blog.csdn.net/article/details/133378624