【LetMeFly】2251.開花期の花数:ソート+2点
Leetcode の質問リンク: https://leetcode.cn/problems/number-of-flowers-in-full-bloom/
0から 始まる 添字が付いた 2 次元の整数配列が与えられますflowers
。これは、 から まで (すべてを含みます) 番目の花の開花期間 を表します 。同時に、添字が0から始まり 、サイズが0 の 整数配列が 与えられます 。 これは 最初の人が費やした時間です。flowers[i] = [starti, endi]
i
starti
endi
n
persons
persons[i]
i
n
sizeの整数配列を返してください 。ここで、 は 最初の 人が到着する 開花期間中の花の 数です 。 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:並べ替え+分割
すべての開花時期を配列に入れて小さい順から大きい順に並べ替え、すべての閉じた開花時期を配列に入れて小さい順から大きい順に並べ替えます。
ある瞬間(ある日)において、現在咲いている花の数は、開花時期が現在時刻以下の花の数 - 閉花している花の現在時刻以下の花の数現在時刻以下の開花時期の花の数 - 閉花している花の数 現在時刻の前日以下の花の数開花時期が現在時刻以下の花の数−閉花数は現在時刻の 1 日前の花数以下です。
非降順配列aaを素早く取得する方法a in≤ k \leq k≤kの要素の数たった2点です。(C++ の upper_bound / Python の bisect_right)
- 時間計算量O ( ( n + m ) log n ) O((n + m)\log n)O (( n+メートル)ログ_n ) ,Exceptn= len (花) n = len (花)n=l e n (花) 、 m = len (人) m = len (人)メートル=レン(人) _ _ _ _ _
- 空間計算量O ( n ) O(n)O ( n )、戻り値はアルゴリズム空間の複雑さには含まれません
ACコード
C++
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