
Problem Statement
In the given scenario, you are presented with an integer limit and a two-dimensional array queries, each sub-array containing two integers. The range from 0 to limit represents distinct labels for limit + 1 balls, which initially are not colored. Upon executing each query [x, y] from the queries array, a ball at position (or label) x is colored with the value y. Your task is to track changes after each query and document the number of distinct colors currently present among all the balls.
Thus, you need to output an array result, where each entry result[i] shows the count of unique colors after processing the i-th query. It's essential to understand that any ball which has not been colored yet is not considered in color counting.
Examples
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^91 <= n == queries.length <= 10^5queries[i].length == 20 <= queries[i][0] <= limit1 <= queries[i][1] <= 10^9
Approach and Intuition
To solve the problem effectively, consider the following approach:
Use Dictionary for Color Tracking:
- Maintain a dictionary 
ball_to_colorto map each ball label to its current color. 
- Maintain a dictionary 
 Track Color Frequencies:
- Use another dictionary 
color_countto store how many balls are using each color. 
- Use another dictionary 
 Process Each Query:
For each query
[x, y]:If ball
xis already colored:- Decrease the count of its current color in 
color_count. - If the count becomes zero, that color is no longer in use.
 
- Decrease the count of its current color in 
 Assign color
yto ballx.Increase the count of color
yincolor_count.
Count Active Colors:
- The number of active colors at each step is the number of keys in 
color_countwith non-zero values. - Track and append this value to the 
resultarray after each query. 
- The number of active colors at each step is the number of keys in 
 Efficiency:
- All operations on dictionaries (lookup, insert, update) are O(1) on average, allowing the algorithm to scale comfortably within the given constraints.
 
This method ensures that color assignment, tracking, and counting are handled efficiently using hash maps, providing optimal performance even for high volumes of queries and large ball label ranges.
Solutions
- C++
 - Java
 - Python
 
class Solution {
public:
    vector<int> processQueries(int maxLimit, vector<vector<int>>& inputQueries) {
        int queryCount = inputQueries.size();
        vector<int> outputs(queryCount);
        unordered_map<int, int> colorFrequency, ballToColor;
    
        for (int index = 0; index < queryCount; index++) {
            int currentBall = inputQueries[index][0], newColor = inputQueries[index][1];
    
            if (ballToColor.find(currentBall) != ballToColor.end()) {
                int oldColor = ballToColor[currentBall];
                colorFrequency[oldColor]--;
    
                if (colorFrequency[oldColor] == 0) colorFrequency.erase(oldColor);
            }
            ballToColor[currentBall] = newColor;
            colorFrequency[newColor]++;
            outputs[index] = colorFrequency.size();
        }
    
        return outputs;
    }
};
- Implement a function to track and return the number of distinct colors used to paint a series of balls given a set of operations.
 - Use C++ with an unordered_map for efficient lookup and update of color frequencies and mappings from balls to their colors.
 - Cycle through each query, which contains the ball number and new color.
 - Check if the ball is already painted:
- If yes, decrease the frequency count of its current color.
 - Remove the color from the frequency tracking if its count reduces to zero.
 
 - Update the ball’s color in the mapping and increment the new color's frequency.
 - Store the count of distinct colors after processing each query.
 - Return the results as a vector, where each element corresponds to the distinct colors count after each query.
 
class Solution {
    
    public int[] processQueries(int max, int[][] inquiry) {
        int count = inquiry.length;
        int[] outcomes = new int[count];
        Map<Integer, Integer> hueMap = new HashMap<>();
        Map<Integer, Integer> sphereMap = new HashMap<>();
    
        for (int idx = 0; idx < count; idx++) {
            int sphere = inquiry[idx][0];
            int hue = inquiry[idx][1];
    
            if (sphereMap.containsKey(sphere)) {
                int oldHue = sphereMap.get(sphere);
                hueMap.put(oldHue, hueMap.get(oldHue) - 1);
    
                if (hueMap.get(oldHue) == 0) {
                    hueMap.remove(oldHue);
                }
            }
            sphereMap.put(sphere, hue);
    
            hueMap.put(hue, hueMap.getOrDefault(hue, 0) + 1);
    
            outcomes[idx] = hueMap.size();
        }
        return outcomes;
    }
}
The provided Java solution defines a method processQueries that determines the number of distinct colors present in a list of inquiries about colored balls. Each inquiry contains information about a ball (represented by sphere) and its color (represented by hue). The main focus is on finding the count of unique hues for each inquiry and updating this count dynamically as inquiries progress.
Here's how this solution operates:
- Two hash maps, 
hueMapandsphereMap, are initialized to track the count of each hue and the current hue for each sphere, respectively. - Loop through each inquiry:
- If the sphere already has an assigned hue, update 
hueMapby decreasing the count of the old hue. If this count reaches zero, remove the old hue fromhueMap. - Update or add the current inquiry's hue in the 
sphereMap. - Adjust 
hueMapto include or update the count of the new hue. - Record the count of distinct hues present (
hueMap.size()) in the result for that particular inquiry. 
 - If the sphere already has an assigned hue, update 
 - The outcome for each inquiry (i.e., the count of distinct hues after considering each inquiry) is stored in the 
outcomesarray, which the method returns. 
This approach effectively maps spheres to their hues while maintaining a real-time count of unique hues. Each entry in the results array corresponds to the number of distinct hues noted after processing each inquiry up to that point. The use of hash maps allows for quick updates and lookups, making this method efficient for handling a potentially large number of inquiries.
class Solution:
    def getColorDistribution(self, max_count: int, colorSeq: List[List[int]]) -> List[int]:
        query_count = len(colorSeq)
        output = []
        ball_color_map = {}
        color_frequency = {}
    
        for index in range(query_count):
            ball_id, color_id = colorSeq[index]
    
            if ball_id in ball_color_map:
                old_color = ball_color_map[ball_id]
                color_frequency[old_color] -= 1
    
                if color_frequency[old_color] == 0:
                    del color_frequency[old_color]
    
            ball_color_map[ball_id] = color_id
            color_frequency[color_id] = color_frequency.get(color_id, 0) + 1
    
            output.append(len(color_frequency))
    
        return output
This Python solution addresses the problem of finding the number of distinct colors among balls based on sequential ball-color updates. The getColorDistribution function inside the Solution class takes two parameters: max_count, which is not used in the function, and colorSeq, a list where each element is another list containing a ball_id and a color_id.
Here’s a step-by-step breakdown of what this function does:
- Initialize an empty list named 
outputto store the results. - Use two dictionaries, 
ball_color_mapto map each ball to its current color, andcolor_frequencyto count how many balls there are of each color. - Iterate through the 
colorSeq.- Extract the 
ball_idandcolor_idfrom each entry. - Check if the ball already has a mapped color:
- If it does, decrease the count of the old color in 
color_frequency. - If this decremented count reaches zero, remove the old color from 
color_frequency. 
 - If it does, decrease the count of the old color in 
 - Map the 
ball_idto the newcolor_idand update or add the new color's frequency incolor_frequency. - Append the number of unique colors, which is the length of 
color_frequency, to the output list. 
 - Extract the 
 - Return the 
outputlist, which represents the number of distinct colors among the balls at each sequential update. 
In conclusion, this function effectively tracks and counts the number of distinct colors by utilizing dictionary operations to handle and update mappings and counts efficiently.