返回介绍

solution / 1800-1899 / 1854.Maximum Population Year / README

发布于 2024-06-17 01:03:13 字数 4318 浏览 0 评论 0 收藏 0

1854. 人口最多的年份

English Version

题目描述

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

 

提示:

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

解法

方法一:差分数组

我们注意到,年份的范围是 $[1950,..2050]$,因此我们可以将这些年份映射到一个长度为 $101$ 的数组 $d$ 中,数组的下标表示年份减去 $1950$ 的值。

接下来遍历 $logs$,对于每个人,我们将 $d[birth_i - 1950]$ 加 $1$,将 $d[death_i - 1950]$ 减 $1$。最后遍历数组 $d$,求出前缀和的最大值,即为人口最多的年份,再加上 $1950$ 即为答案。

时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 为数组 $logs$ 的长度;而 $C$ 为年份的范围大小,即 $2050 - 1950 + 1 = 101$。

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
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;
  }
};
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;
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文