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

给你一个二维整数数组 logs ,其中每个 logsi = 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就是人口最多的年份。

相关推荐
折哥的程序人生 · 物流技术专研3 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
想吃火锅10055 小时前
【leetcode】14.最长公共前缀js
算法·leetcode·职场和发展
云絮.6 小时前
数据库操作
数据库·mysql·算法·oracle
小林ixn6 小时前
LeetCode 206. 反转链表(迭代 + 递归详解)
算法·leetcode·链表
凡人叶枫6 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
菜鸟‍8 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展
退休倒计时9 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
popcorn_min9 小时前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类
liulilittle10 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
花间相见10 小时前
【LeetCode02】—— 两数之和:哈希表入门经典详解
数据结构·散列表