题目链接
生存人数
题目描述
注意点
- 假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间
- birth[i] <= death[i]
- 如果有多个年份生存人数相同且均为最大值,输出其中最小的年份
解答思路
- 初始想到的是遍历birth,更新birth[i]和death[i]对应区间内每一年的人口总数,然后再遍历1900-2000之间哪个年份人口最多,但是更新区间内每一年的人口总数会耗费较多时间
- 参照题解可以统计每一年人口的净增长,birth[i]则净增长加一,death[i]则净增长减一,统计完后可以贪心算法找到人口最多的年份,不再需要更新区间内每一年的人口总数
代码
class Solution {public int maxAliveYear(int[] birth, int[] death) {int res = 0;int[] arr = new int[102];int n = birth.length;// 统计每年人口的净增长for (int i = 0; i < n; i++) {arr[birth[i] - 1900] += 1;arr[death[i] - 1900 + 1] -= 1;}int maxP = 0;int preP = 0;// 贪心算法寻找人口最多的年份for (int i = 0; i < arr.length; i++) {int curP = preP + arr[i];if (curP > maxP) {res = i;maxP = curP;}if (curP < 0) {preP = 0;} else {preP = curP;}}return res + 1900;}
}
关键点
- 统计每一年人口的净增长数量