人口最多的年份

标签: 数组 计数 前缀和

难度: Easy

给你一个二维整数数组 logs ,其中每个 logs[i] = [birthi, deathi] 表示第 i 个人的出生和死亡年份。

年份 x人口 定义为这一年期间活着的人的数目。第 i 个人被计入年份 x 的人口需要满足:x 在闭区间 [birthi, deathi - 1] 内。注意,人不应当计入他们死亡当年的人口中。

返回 人口最多最早 的年份。

 

示例 1:

输入:logs = [[1993,1999],[2000,2010]]
输出:1993
解释:人口最多为 1 ,而 1993 是人口为 1 的最早年份。

示例 2:

输入:logs = [[1950,1961],[1960,1971],[1970,1981]]
输出:1960
解释: 
人口最多为 2 ,分别出现在 1960 和 1970 。
其中最早年份是 1960 。

 

提示:

  • 1 <= logs.length <= 100
  • 1950 <= birthi < deathi <= 2050

Submission

运行时间: 23 ms

内存: 16.0 MB

class Solution:
    def maximumPopulation(self, logs: List[List[int]]) -> int:
        res=[0]*100
        for i in range(len(logs)):
            for j in range(logs[i][0],logs[i][1]):
                res[j-1950]+=1
        ma=0

        ins=0
        for i in range(len(res)):
            if res[i]>ma:
            
                ma=res[i]
                ins=i

        return ins+1950

Explain

该题解采用了计数的方法来解决问题。首先,创建一个大小为100的数组(因为年份从1950到2049,共100年),用于记录每一年的人口数量。遍历每个人的生命记录,对于每个人,其在生存期间的每一年对应的数组位置增加1,表示那一年的人口增加了1。在更新完所有人的生存记录后,再遍历这个数组,找到人口最多的年份。如果有多个年份人口相同,由于是从最早的年份开始统计的,第一个找到的最大值将是最早的年份。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def maximumPopulation(self, logs: List[List[int]]) -> int:
        res = [0] * 100  # 创建用于存储每年人口数量的数组
        for log in logs:  # 遍历每个人的生死年份
            for year in range(log[0], log[1]):  # 遍历每个人的生存年份
                res[year - 1950] += 1  # 更新对应年份人口数量
        max_population = 0  # 用于记录最大人口数
        earliest_year = 0  # 用于记录人口最多的最早年份
        for i in range(len(res)):  # 遍历每一年查找人口最多的年份
            if res[i] > max_population:  # 如果当前年份人口更多
                max_population = res[i]  # 更新最大人口数
                earliest_year = i  # 更新最早年份记录
        return earliest_year + 1950  # 返回最早的人口最多年份

Explore

选择使用大小为100的数组来记录每一年的人口数量是因为年份范围(1950到2049)是已知的且连续的,这使得数组可以通过简单的索引来访问对应年份的人口数量。数组的访问时间复杂度为O(1),这比哈希表的平均O(1)时间复杂度更为稳定且没有额外的哈希冲突处理开销。此外,数组因其连续内存分配,也优于哈希表在空间局部性方面的表现,这有助于提升缓存效率。

题解中直接使用`range(log[0], log[1])`来计算每一个人的生存年份,基于假设输入数据始终有效,即所有的出生和死亡年份都严格在1950到2049范围内。如果实际应用需要处理边界外的年份,那么代码应该添加适当的边界检查以避免数组访问越界。但在这个特定问题的设定中,这样的检查被认为是不必要的,前提是输入数据遵循这一规范。

是的,根据题解的逻辑,`人口最多的最早年份`的定义确实意味着如果存在多个年份人口数量相同,只关心最早出现的年份。这是通过在找到新的最大人口数量时立即更新年份实现的,而不是继续搜索可能出现相同人口数量的其他年份。这种方法确保了只记录第一次达到最大值的年份。

题解中的`res[year - 1950] += 1`操作基于假定所有输入数据都是正确的,即每个人的死亡年份都晚于或等于其出生年份。如果输入数据中死亡年份早于出生年份,这将导致`range`函数生成一个空序列,因此不会执行任何加法操作,也不会引发错误。然而,这种情况在现实中可能表示输入数据本身存在问题,应该在实际应用中进行错误处理或数据验证。