Welcome to Subscribe On Youtube

1854. Maximum Population Year

Description

You are given a 2D integer array logs where each logs[i] = [birthi, deathi] indicates the birth and death years of the ith person.

The population of some year x is the number of people alive during that year. The ith person is counted in year x's population if x is in the inclusive range [birthi, deathi - 1]. Note that the person is not counted in the year that they die.

Return the earliest year with the maximum population.

 

Example 1:

Input: logs = [[1993,1999],[2000,2010]]
Output: 1993
Explanation: The maximum population is 1, and 1993 is the earliest year with this population.

Example 2:

Input: logs = [[1950,1961],[1960,1971],[1970,1981]]
Output: 1960
Explanation: 
The maximum population is 2, and it had happened in years 1960 and 1970.
The earlier year between them is 1960.

 

Constraints:

  • 1 <= logs.length <= 100
  • 1950 <= birthi < deathi <= 2050

Solutions

Solution 1: Difference Array

We notice that the range of years is $[1950,..2050]$. Therefore, we can map these years to an array $d$ of length $101$, where the index of the array represents the value of the year minus $1950$.

Next, we traverse $logs$. For each person, we increment $d[birth_i - 1950]$ by $1$ and decrement $d[death_i - 1950]$ by $1$. Finally, we traverse the array $d$, find the maximum value of the prefix sum, which is the year with the most population, and add $1950$ to get the answer.

The time complexity is $O(n)$, and the space complexity is $O(C)$. Where $n$ is the length of the array $logs$, and $C$ is the range size of the years, i.e., $2050 - 1950 + 1 = 101$.

  • class Solution {
        public int maximumPopulation(int[][] logs) {
            int[] d = new int[101];
            final int offset = 1950;
            for (var log : logs) {
                int a = log[0] - offset;
                int b = log[1] - offset;
                ++d[a];
                --d[b];
            }
            int s = 0, mx = 0;
            int j = 0;
            for (int i = 0; i < d.length; ++i) {
                s += d[i];
                if (mx < s) {
                    mx = s;
                    j = i;
                }
            }
            return j + offset;
        }
    }
    
  • class Solution {
    public:
        int maximumPopulation(vector<vector<int>>& logs) {
            int d[101]{};
            const int offset = 1950;
            for (auto& log : logs) {
                int a = log[0] - offset;
                int b = log[1] - offset;
                ++d[a];
                --d[b];
            }
            int s = 0, mx = 0;
            int j = 0;
            for (int i = 0; i < 101; ++i) {
                s += d[i];
                if (mx < s) {
                    mx = s;
                    j = i;
                }
            }
            return j + offset;
        }
    };
    
  • class Solution:
        def maximumPopulation(self, logs: List[List[int]]) -> int:
            d = [0] * 101
            offset = 1950
            for a, b in logs:
                a, b = a - offset, b - offset
                d[a] += 1
                d[b] -= 1
            s = mx = j = 0
            for i, x in enumerate(d):
                s += x
                if mx < s:
                    mx, j = s, i
            return j + offset
    
    
  • func maximumPopulation(logs [][]int) int {
    	d := [101]int{}
    	offset := 1950
    	for _, log := range logs {
    		a, b := log[0]-offset, log[1]-offset
    		d[a]++
    		d[b]--
    	}
    	var s, mx, j int
    	for i, x := range d {
    		s += x
    		if mx < s {
    			mx = s
    			j = i
    		}
    	}
    	return j + offset
    }
    
  • function maximumPopulation(logs: number[][]): number {
        const d: number[] = new Array(101).fill(0);
        const offset = 1950;
        for (const [birth, death] of logs) {
            d[birth - offset]++;
            d[death - offset]--;
        }
        let j = 0;
        for (let i = 0, s = 0, mx = 0; i < d.length; ++i) {
            s += d[i];
            if (mx < s) {
                mx = s;
                j = i;
            }
        }
        return j + offset;
    }
    
    
  • /**
     * @param {number[][]} logs
     * @return {number}
     */
    var maximumPopulation = function (logs) {
        const d = new Array(101).fill(0);
        const offset = 1950;
        for (let [a, b] of logs) {
            a -= offset;
            b -= offset;
            d[a]++;
            d[b]--;
        }
        let j = 0;
        for (let i = 0, s = 0, mx = 0; i < 101; ++i) {
            s += d[i];
            if (mx < s) {
                mx = s;
                j = i;
            }
        }
        return j + offset;
    };
    
    

All Problems

All Solutions