给定N个人的出生年份和死亡年份,第i个人的出生年份为birth[i],死亡年份为death[i],实现一个方法以计算生存人数最多的年份。
你可以假设所有人都出生于1900年至2000年(含1900和2000)之间。如果一个人在某一年的任意时期都处于生存状态,那么他们应该被纳入那一年的统计中。例如,生于1908年、死于1909年的人应当被列入1908年和1909年的计数。
如果有多个年份生存人数相同且均为最大值,输出其中最小的年份。
示例:
输入:
birth = {1900, 1901, 1950}
death = {1948, 1951, 2000}
输出: 1901
提示:
0 < birth.length == death.length <= 10000
birth[i] <= death[i]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/living-people-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
写题思路:就是想着把一个人存在的年份里面全部遍历一遍都加上1,之后所有人都是如此,最后取出人数最大的年份;
(但是这样的时间复杂度是O(n^2)有点大)
代码如下:
int maxAliveYear(int* birth, int birthSize, int* death, int deathSize){
int year[101]={0};//1900-2000是101年
int i,j,tmp=0;
for(i=0;i<birthSize;i++)
for(j=birth[i];j<=death[i];j++)
year[j-1900]++;
for(i=1;i<101;i++)
if(year[tmp]<year[i])
tmp=i;
return tmp+1900;
}
还有时间复杂度为n的,让我自己想是绝对想不出来的,代码如下:
int maxAliveYear(int* birth, int birthSize, int* death, int deathSize){
int year[102]={0};//多了一个是因为后续判断有一个加一
int i,j,tmp=0,max=0;
for(i=0;i<birthSize;i++){
year[birth[i]-1900]++;//出生了便是存在了自然要加1
year[death[i]-1900+1]--;
/*因为死亡的当年也要计算在内,
所以下一年才能把这个人去掉,综上这两个式子,就可以
省去在这存在的年间的遍历加1,下一步只需要持续遍
历相加人数和判断即可知道在哪的人最多*/
}
for(i=0;i<101;i++){
tmp+=year[i];//这里是遍历相加的人数
if(max<tmp){
max=tmp;
j=i;
}
}
return j+1900;
}