1854. 人口最多的年份
1854. 人口最多的年份
給你一個(gè)二維整數(shù)數(shù)組 logs ,其中每個(gè) logs[i] = [birthi, deathi] 表示第 i 個(gè)人的出生和死亡年份。
年份 x 的 人口 定義為這一年期間活著的人的數(shù)目。第 i 個(gè)人被計(jì)入年份 x 的人口需要滿足:x 在閉區(qū)間 [birthi, deathi - 1] 內(nèi)。注意,人不應(yīng)當(dāng)計(jì)入他們死亡當(dāng)年的人口中。
返回 人口最多 且 最早 的年份。
示例 1:輸入:logs = [[1993,1999],[2000,2010]] 輸出:1993 解釋:人口最多為 1 ,而 1993 是人口為 1 的最早年份。示例 2:輸入:logs = [[1950,1961],[1960,1971],[1970,1981]] 輸出:1960 解釋: 人口最多為 2 ,分別出現(xiàn)在 1960 和 1970 。 其中最早年份是 1960 。提示:
- 1 <= logs.length <= 100
- 1950 <= birthi < deathi <= 2050
解題思路
使用小根堆維護(hù)死亡時(shí)間的先后次序,再對(duì)出生時(shí)間進(jìn)行從小到大的排序,從小到大遍歷出生時(shí)間,每當(dāng)遍歷到一個(gè)時(shí)間,就說(shuō)明在這個(gè)時(shí)間點(diǎn)上有人出生,因此我們需要把當(dāng)前的人數(shù)加一,當(dāng)我們發(fā)現(xiàn)小根堆里面出現(xiàn)了比當(dāng)前出生時(shí)間還要小的元素,說(shuō)明了在該人出生之前有人死亡,因此我們需要將這部分人移除出小根堆,并且將當(dāng)前存活的人數(shù)減去。每次遍歷出生時(shí)間的時(shí)候,就統(tǒng)計(jì)一遍當(dāng)前存活的人數(shù),如果當(dāng)前的人數(shù)是目前的最大值,則將人口最多的年份置為遍歷到的出生年份。
代碼
class Solution { public:int maximumPopulation(vector<vector<int>> &logs) {int m(0),res=-1,idx=-1;priority_queue<int,vector<int>,greater<int>> pq;for (auto l:logs)pq.push(l[1]);sort(logs.begin(),logs.end());for(auto l:logs){while (l[0]>=pq.top()){pq.pop();m--;} m++;if (m>res){res=m;idx=l[0];}}return idx;} };解題思路
使用差分?jǐn)?shù)組的思路,因?yàn)檫@題的時(shí)間跨度比較小,只有100個(gè)年份,因此我們可以記錄每個(gè)年份增加了人數(shù),哪個(gè)年份減少了人數(shù),最后通過(guò)遍歷所有年份人數(shù)的增減,去確定人口最多 且 最早 的年份
代碼
class Solution { public:int maximumPopulation(vector<vector<int>> &logs) {int m(0),res=-1,idx=-1;vector<int> v(101);for (auto l:logs){v[l[0]-1950]++;v[l[1]-1950]--;}for (int i = 0; i < 101; ++i) {m+=v[i];if (m>res){res=m;idx=i+1950;}}return idx;} };總結(jié)
以上是生活随笔為你收集整理的1854. 人口最多的年份的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 384. 打乱数组
- 下一篇: 1859. 将句子排序