假设我们有一个包含两列(出生、死亡)的表格,其中每一行代表第 i 个人的出生和死亡年份。某年 y 的人口是 y 期间活着的人数。当 y 在包含范围 [birth_i, death_i - 1] 内时,第 i 个人被计入第 y 年的人口中。(此人不计入他们死亡的年份)。因此,我们必须找到人口最多的最早年份。
所以,如果输入是这样的
Birth | 死亡 |
1970 | 2010年 |
1960 | 2020年 |
1940 | 1970年 |
那么输出将是 2,因为只有一个值与目标匹配,即 nums[4],所以 i = 4。现在 |4-2| = 2。
为了解决这个问题,我们将按照以下步骤操作 -
d := 一个映射,如果找不到某个键,则返回 0
res := 包含两项的列表 [2051, 0]
对于矩阵中的每一年出生 YOB 和死亡年份 YOD,做
d[年] := d[年] + 1
如果 d[year] >= res[1],则
res := 包含两个元素的列表 [(年份和 res[0] 的最小值), res[1]]
res := 包含两个元素的列表 [year, d[year]]
如果 d[year] > res[1],则
否则,
对于 YOB 到 YOD 范围内的年份,请执行
返回资源[0]
让我们看看以下实现以获得更好的理解 -
from collections import defaultdict def solve(matrix): d = defaultdict(int) res = [2051, 0] for YOB, YOD in matrix: for year in range(YOB, YOD): d[year] += 1 if d[year] >= res[1]: if d[year] > res[1]: res = [year, d[year]] else: res = [min(year, res[0]), res[1]] return res[0] matrix = [[1970,2010],[1960,2020],[1940,1970]] print(solve(matrix))
[[1970,2010],[1960,2020],[1940,1970]]输出结果
1960