返回介绍

solution / 1800-1899 / 1817.Finding the Users Active Minutes / README

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

1817. 查找用户活跃分钟数

English Version

题目描述

给你用户在 LeetCode 的操作日志,和一个整数 k 。日志用一个二维整数数组 logs 表示,其中每个 logs[i] = [IDi, timei] 表示 ID 为 IDi 的用户在 timei 分钟时执行了某个操作。

多个用户 可以同时执行操作,单个用户可以在同一分钟内执行 多个操作

指定用户的 用户活跃分钟数(user active minutes,UAM) 定义为用户对 LeetCode 执行操作的 唯一分钟数 。 即使一分钟内执行多个操作,也只能按一分钟计数。

请你统计用户活跃分钟数的分布情况,统计结果是一个长度为 k下标从 1 开始计数 的数组 answer ,对于每个 j1 <= j <= k),answer[j] 表示 用户活跃分钟数 等于 j 的用户数。

返回上面描述的答案数组 answer

 

示例 1:

输入:logs = [[0,5],[1,2],[0,2],[0,5],[1,3]], k = 5
输出:[0,2,0,0,0]
解释:
ID=0 的用户执行操作的分钟分别是:5 、2 和 5 。因此,该用户的用户活跃分钟数为 2(分钟 5 只计数一次)
ID=1 的用户执行操作的分钟分别是:2 和 3 。因此,该用户的用户活跃分钟数为 2
2 个用户的用户活跃分钟数都是 2 ,answer[2] 为 2 ,其余 answer[j] 的值都是 0

示例 2:

输入:logs = [[1,1],[2,2],[2,3]], k = 4
输出:[1,1,0,0]
解释:
ID=1 的用户仅在分钟 1 执行单个操作。因此,该用户的用户活跃分钟数为 1
ID=2 的用户执行操作的分钟分别是:2 和 3 。因此,该用户的用户活跃分钟数为 2
1 个用户的用户活跃分钟数是 1 ,1 个用户的用户活跃分钟数是 2 
因此,answer[1] = 1 ,answer[2] = 1 ,其余的值都是 0

 

提示:

  • 1 <= logs.length <= 104
  • 0 <= IDi <= 109
  • 1 <= timei <= 105
  • k 的取值范围是 [用户的最大用户活跃分钟数, 105]

解法

方法一:哈希表

我们用哈希表 $d$ 记录每个用户的所有去重操作时间,然后遍历哈希表,统计每个用户的用户活跃分钟数,最后统计每个用户活跃分钟数的分布情况。

时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $logs$ 的长度。

class Solution:
  def findingUsersActiveMinutes(self, logs: List[List[int]], k: int) -> List[int]:
    d = defaultdict(set)
    for i, t in logs:
      d[i].add(t)
    ans = [0] * k
    for ts in d.values():
      ans[len(ts) - 1] += 1
    return ans
class Solution {
  public int[] findingUsersActiveMinutes(int[][] logs, int k) {
    Map<Integer, Set<Integer>> d = new HashMap<>();
    for (var log : logs) {
      int i = log[0], t = log[1];
      d.computeIfAbsent(i, key -> new HashSet<>()).add(t);
    }
    int[] ans = new int[k];
    for (var ts : d.values()) {
      ++ans[ts.size() - 1];
    }
    return ans;
  }
}
class Solution {
public:
  vector<int> findingUsersActiveMinutes(vector<vector<int>>& logs, int k) {
    unordered_map<int, unordered_set<int>> d;
    for (auto& log : logs) {
      int i = log[0], t = log[1];
      d[i].insert(t);
    }
    vector<int> ans(k);
    for (auto& [_, ts] : d) {
      ++ans[ts.size() - 1];
    }
    return ans;
  }
};
func findingUsersActiveMinutes(logs [][]int, k int) []int {
  d := map[int]map[int]bool{}
  for _, log := range logs {
    i, t := log[0], log[1]
    if _, ok := d[i]; !ok {
      d[i] = make(map[int]bool)
    }
    d[i][t] = true
  }
  ans := make([]int, k)
  for _, ts := range d {
    ans[len(ts)-1]++
  }
  return ans
}
function findingUsersActiveMinutes(logs: number[][], k: number): number[] {
  const d: Map<number, Set<number>> = new Map();
  for (const [i, t] of logs) {
    if (!d.has(i)) {
      d.set(i, new Set<number>());
    }
    d.get(i)!.add(t);
  }
  const ans: number[] = Array(k).fill(0);
  for (const [_, ts] of d) {
    ++ans[ts.size - 1];
  }
  return ans;
}

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

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

发布评论

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