加载中...
面试题 16.10-生存人数(Living People LCCI)
发表于:2021-12-03 | 分类: 中等
字数统计: 327 | 阅读时长: 1分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/living-people-lcci

英文原文

Given a list of people with their birth and death years, implement a method to compute the year with the most number of people alive. You may assume that all people were born between 1900 and 2000 (inclusive). If a person was alive during any portion of that year, they should be included in that year's count. For example, Person (birth= 1908, death= 1909) is included in the counts for both 1908 and 1909.

If there are more than one years that have the most number of people alive, return the smallest one.

Example:

Input: 
birth = {1900, 1901, 1950}
death = {1948, 1951, 2000}
Output:  1901

Note:

  • 0 < birth.length == death.length <= 10000
  • birth[i] <= death[i]

中文题目

给定 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]

通过代码

高赞题解

解题思路:
1.可以换一种思路去理解这个问题,将问题转换为:某公交车从第1900站做为起点,第2000站做为终点。第i个人表示从第birth[i]站上车,在第death[i] + 1站下车。
那么这里为什么是第death[i] + 1下车呢?
是因为题目描述到生于1908年,死于1909年的人应当被列入1908年和1909年的计数,所以我们需要在第death[i]站还需要记录,在下一站在减去。
2.根据思路,定义res[]记录每站数组的人数变化,因为题目范围是1900到2000,我们可以定义数组大小为110个。遍历数组,res[birth[i] - 1900]表示第birth[i]站上一人,res[death[i] + 1 - 1900]表示第death[i] + 1站下一人。
3.整理res[]数组,找到车上人最多的站。

代码块

class Solution {
public:
    int maxAliveYear(vector<int>& birth, vector<int>& death) {
        vector<int> res(110, 0);
        int n = birth.size();
        //生于1908年、死于1909年的人应当被列入1908年和1909年的计数
        for(int i = 0; i < n; i++){
            res[birth[i] - 1900] += 1;
            res[death[i] + 1 - 1900] -= 1;
        }
        int ans = 0;
        //年数的较小值
        int ret;
        for(int i = 1; i <= 101; i++){
            res[i] += res[i-1];
            ans = max(ans, res[i]);
        }
        for(int i = 0; i <= 101; i++){
            if(ans == res[i]){
                ret = i;
                break;
            }
        }
        return ret + 1900;
    }
};

## 统计信息
| 通过次数 | 提交次数 | AC比率 |
| :------: | :------: | :------: |
|    11000    |    16188    |   68.0%   |

## 提交历史
| 提交时间 | 提交结果 | 执行时间 |  内存消耗  | 语言 |
| :------: | :------: | :------: | :--------: | :--------: |
上一篇:
面试题 16.09-运算(Operations LCCI)
下一篇:
面试题 16.13-平分正方形(Bisect Squares LCCI)
本文目录
本文目录