Frequency Queries

  • + 0 comments

    Two dictionary appraoches: O(1) time complexity O(n) space

    def freqQuery(queries):
        num_freq = defaultdict(int)
        freq_freq = defaultdict(int)
        
        ans = []
        for query in queries:
            if query[0] == 1:
                # the freq of this number plus 1
                # the freq of this freq also plus 1
                # remove the old frequency since the freq of this number has increased
                if query[1] in num_freq:
                    old_freq = num_freq[query[1]]
                    freq_freq[old_freq] -= 1
                    if freq_freq[old_freq] == 0:
                        freq_freq.pop(old_freq)
                    
                num_freq[query[1]] += 1
                freq_freq[num_freq[query[1]]] += 1
                
            elif query[0] == 2:
                if query[1] in num_freq:
                    cur_freq = num_freq[query[1]]
                    num_freq[query[1]] -= 1
                    if num_freq[query[1]] == 0:
                        num_freq.pop(query[1])
                        
                    # there is no 0 freq in the freq_freq dict
                    freq_freq[cur_freq] -= 1
                    if freq_freq[cur_freq] == 0:
                        freq_freq.pop(cur_freq)
                        
                    if cur_freq > 1:
                        freq_freq[cur_freq-1] += 1
                        
            elif query[0] == 3:
                if query[1] in freq_freq:
                    ans.append(1)
                else:
                    ans.append(0)
        return ans