Problem
You are given an integer limit and a 2D array queries of size n x 2.
There are limit + 1 balls with distinct labels in the range [0, limit]. Initially, all balls are uncolored. For every query in queries that is of the form [x, y], you mark ball x with the color y. After each query, you need to find the number of distinct colors among the balls.
Return an array result of length n, where result[i] denotes the number of distinct colors after iᵗʰ query.
Note that when answering a query, lack of a color will not be considered as a color.
https://leetcode.com/problems/find-the-number-of-distinct-colors-among-the-balls/
Example 1:
Input:
limit = 4, queries = [[1,4],[2,5],[1,3],[3,4]]
Output:[1,2,2,3]
Explanation:
- After query 0, ball 1 has color 4.
- After query 1, ball 1 has color 4, and ball 2 has color 5.
- After query 2, ball 1 has color 3, and ball 2 has color 5.
- After query 3, ball 1 has color 3, ball 2 has color 5, and ball 3 has color 4.
Example 2:
Input:
limit = 4, queries = [[0,1],[1,2],[2,2],[3,4],[4,5]]
Output:[1,2,2,3,4]
Explanation:
- After query 0, ball 0 has color 1.
- After query 1, ball 0 has color 1, and ball 1 has color 2.
- After query 2, ball 0 has color 1, and balls 1 and 2 have color 2.
- After query 3, ball 0 has color 1, balls 1 and 2 have color 2, and ball 3 has color 4.
- After query 4, ball 0 has color 1, balls 1 and 2 have color 2, ball 3 has color 4, and ball 4 has color 5.
Constraints:
1 <= limit <= 10⁹1 <= n == queries.length <= 10⁵queries[i].length == 20 <= queries[i][0] <= limit1 <= queries[i][1] <= 10⁹
Test Cases
1 | class Solution: |
1 | import pytest |
Thoughts
需要记录每个球的颜色,以及每个颜色的球数。后者用字典,并在某个颜色的球数归零时将 key 删掉,就可以用 O(1) 时间获取各不相同的颜色总数。
对于每个 query,给被涂色的球的原来的颜色的球数减一,新颜色的球数加一,并记录该球最后的颜色。
记录每个球的颜色可以用数组,也可以用字典,考虑到本题 limit 的量级为 10⁹,而 queries 的量级(n)为 10⁵,也就是说最多只有 n 个球会被涂色,用字典的空间占用更低。
时间复杂度 O(n),空间复杂度 O(n)。
Code
1 | from collections import defaultdict |

