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

相关推荐
计算机小白一个3 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^4 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
大数据追光猿6 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!6 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉6 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生6 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴6 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
Leuanghing6 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
qy发大财6 小时前
加油站(力扣134)
算法·leetcode·职场和发展
王老师青少年编程6 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛