查找用户活跃分钟数
难度:
标签:
题目描述
代码结果
运行时间: 66 ms, 内存: 22.3 MB
/*
题目思路:
1. 使用 Java Stream API 处理 logs 数据,计算每个用户的活跃分钟数。
2. 使用 Map 来记录每个用户的活跃分钟数。
3. 使用 Map 合并用户活跃分钟数,统计每个活跃分钟数的用户数量。
4. 最后返回结果数组。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public int[] findingUsersActiveMinutes(int[][] logs, int k) {
Map<Integer, Set<Integer>> userMinutes = Arrays.stream(logs)
.collect(Collectors.groupingBy(log -> log[0], Collectors.mapping(log -> log[1], Collectors.toSet())));
return userMinutes.values().stream()
.collect(Collectors.groupingBy(Set::size, Collectors.counting()))
.entrySet().stream()
.collect(Collectors.reducing(new int[k], (res, e) -> {
if (e.getKey() <= k) res[e.getKey() - 1] = e.getValue().intValue();
return res;
}, (res1, res2) -> res1));
}
}
解释
方法:
首先使用哈希表来存储每个用户对应的操作时间集合,确保时间的唯一性。遍历日志数组,将每个用户ID的操作时间添加到对应的集合中。这样可以计算出每个用户的活跃分钟数(即集合的大小)。之后,使用另一个哈希表来统计各个活跃分钟数的用户数量。最终,根据这个统计结果生成一个长度为k的数组,数组的第j个位置表示活跃分钟数为j的用户数量。
时间复杂度:
O(n)
空间复杂度:
O(u + t + k)
代码细节讲解
🦆
类 `Counter` 在你的解法中具体是如何应用的,它对效率有什么影响?
▷🦆
在统计每个用户的活跃分钟数时,你是怎样处理用户活跃分钟数超过 `k` 的情况的?
▷🦆
你的算法在面对极端情况,比如日志非常密集或非常稀疏时,性能表现如何?
▷🦆
你是如何保证最终结果数组 `result` 的长度恰好为 `k`,并正确处理所有可能的活跃分钟数的?
▷