【数据结构-一维差分】力扣1854. 人口最多的年份

给你一个二维整数数组 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 。


差分

cpp 复制代码
class Solution {
private:
    static constexpr int offset = 1950;

public:
    int maximumPopulation(vector<vector<int>>& logs) {
        vector<int> diff(101);
        for(auto log : logs){
            diff[log[0]-offset]++;
            diff[log[1]-offset]--;
        }

        int maxNum = INT_MIN, res = 0, s = 0;
        for(int i = 0; i <= 100; i++){
            s += diff[i];
            if(s > maxNum){
                maxNum = s;
                res = i;
            }
        }
        return res + offset;
    }
};

由于题目给出了birth和death的范围,所以我们可以使下标i对应offset+i年。在使用差分的时候要注意的是death的那一年,就不算入人口,这和覆盖类的差分不一样,覆盖类差分需要diff[log[1] + 1 -offset]--。然后我们定义一个res来记录最多人口的年份,maxNum来计入最大人口的数量,然后去遍历每一年的人口,最后返回res+offset就是人口最多的年份。

相关推荐
寄存器漫游者10 分钟前
数据结构 C语言 顺序栈
java·c语言·数据结构
m0_7482331720 分钟前
C#与C语言:5大核心语法共性
java·jvm·算法
痴儿哈哈36 分钟前
C++与硬件交互编程
开发语言·c++·算法
小O的算法实验室44 分钟前
2024年ESWA SCI1区TOP,异构无人机配送问题的集成多目标优化方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
日拱一卒——功不唐捐1 小时前
循环队列+双端队列(C语言)
c语言·数据结构
草履虫建模1 小时前
力扣算法 121. 买卖股票的最佳时机
算法·leetcode·职场和发展·贪心算法·动态规划·一次遍历
养军博客1 小时前
C语言五天速成(可用于蓝桥杯备考 难度中等偏下)
c语言·算法·蓝桥杯
爱尔兰极光1 小时前
LeetCode--有序数组的平方
算法·leetcode·职场和发展
hnjzsyjyj1 小时前
洛谷 P3383:线性筛素数 ← 埃氏筛
数据结构·埃氏筛
jay神1 小时前
森林火灾检测数据集
算法·机器学习·目标跟踪