Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using array strategy.
You are given the logs for users' actions on LeetCode, and an integer k. The logs are represented by a 2D integer array logs where each logs[i] = [IDi, timei] indicates that the user with IDi performed an action at the minute timei.
Multiple users can perform actions simultaneously, and a single user can perform multiple actions in the same minute.
The user active minutes (UAM) for a given user is defined as the number of unique minutes in which the user performed an action on LeetCode. A minute can only be counted once, even if multiple actions occur during it.
You are to calculate a 1-indexed array answer of size k such that, for each j (1 <= j <= k), answer[j] is the number of users whose UAM equals j.
Return the array answer as described above.
Example 1:
Input: logs = [[0,5],[1,2],[0,2],[0,5],[1,3]], k = 5 Output: [0,2,0,0,0] Explanation: The user with ID=0 performed actions at minutes 5, 2, and 5 again. Hence, they have a UAM of 2 (minute 5 is only counted once). The user with ID=1 performed actions at minutes 2 and 3. Hence, they have a UAM of 2. Since both users have a UAM of 2, answer[2] is 2, and the remaining answer[j] values are 0.
Example 2:
Input: logs = [[1,1],[2,2],[2,3]], k = 4 Output: [1,1,0,0] Explanation: The user with ID=1 performed a single action at minute 1. Hence, they have a UAM of 1. The user with ID=2 performed actions at minutes 2 and 3. Hence, they have a UAM of 2. There is one user with a UAM of 1 and one with a UAM of 2. Hence, answer[1] = 1, answer[2] = 1, and the remaining values are 0.
Constraints:
1 <= logs.length <= 1040 <= IDi <= 1091 <= timei <= 105k is in the range [The maximum UAM for a user, 105].Problem summary: You are given the logs for users' actions on LeetCode, and an integer k. The logs are represented by a 2D integer array logs where each logs[i] = [IDi, timei] indicates that the user with IDi performed an action at the minute timei. Multiple users can perform actions simultaneously, and a single user can perform multiple actions in the same minute. The user active minutes (UAM) for a given user is defined as the number of unique minutes in which the user performed an action on LeetCode. A minute can only be counted once, even if multiple actions occur during it. You are to calculate a 1-indexed array answer of size k such that, for each j (1 <= j <= k), answer[j] is the number of users whose UAM equals j. Return the array answer as described above.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Hash Map
[[0,5],[1,2],[0,2],[0,5],[1,3]] 5
[[1,1],[2,2],[2,3]] 4
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1817: Finding the Users Active Minutes
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;
}
}
// Accepted solution for LeetCode #1817: Finding the Users Active Minutes
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
}
# Accepted solution for LeetCode #1817: Finding the Users Active Minutes
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
// Accepted solution for LeetCode #1817: Finding the Users Active Minutes
struct Solution;
use std::collections::HashMap;
use std::collections::HashSet;
impl Solution {
fn finding_users_active_minutes(logs: Vec<Vec<i32>>, k: i32) -> Vec<i32> {
let mut users: HashMap<i32, HashSet<i32>> = HashMap::new();
let k = k as usize;
let mut res = vec![0; k];
for log in logs {
let id = log[0];
let time = log[1];
users.entry(id).or_default().insert(time);
}
for times in users.values() {
let j = times.len() - 1;
if j < k {
res[j] += 1;
}
}
res
}
}
#[test]
fn test() {
let logs = vec_vec_i32![[0, 5], [1, 2], [0, 2], [0, 5], [1, 3]];
let k = 5;
let res = vec![0, 2, 0, 0, 0];
assert_eq!(Solution::finding_users_active_minutes(logs, k), res);
let logs = vec_vec_i32![[1, 1], [2, 2], [2, 3]];
let k = 4;
let res = vec![1, 1, 0, 0];
assert_eq!(Solution::finding_users_active_minutes(logs, k), res);
}
// Accepted solution for LeetCode #1817: Finding the Users Active Minutes
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;
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Zero-count keys stay in map and break distinct/count constraints.
Usually fails on: Window/map size checks are consistently off by one.
Fix: Delete keys when count reaches zero.