【数据结构-一维差分】力扣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就是人口最多的年份。

相关推荐
会员源码网8 小时前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing9 小时前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader10 小时前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱12 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng89714 小时前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮1 天前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员1 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶