📌  相关文章
📜  教资会网络 | UGC NET CS 2014 年 12 月 – III |问题 10(1)

📅  最后修改于: 2023-12-03 15:26:02.720000             🧑  作者: Mango

UGC NET CS 2014 年 12 月 – III | 问题 10

本题主要考察程序员们的算法设计和编码能力。问题描述如下:

给定一个长度为n的整数数组A和一个整数k,设计一个算法来找到A中前k个最常见的元素。若两个数字出现的次数相同,则较小的数字应放在前面。

如果数组A是 [3,1,1,2,2,1,4,4,4,4],k是3,那么需要找到前三个最常见的元素,应返回1,2,4

解题思路

首先我们需要计算每个数字在数组A中的出现次数,可以使用一个字典(Python中的dict)来实现。遍历数组A,对于每个数字,将其添加到字典中,并将其出现次数加1。

接下来,按照数字出现的次数对字典中的数字进行排序,可以使用Python中的sorted()函数,同时使用lambda表达式来指定排序方式。最后将前k个数字添加到一个新的列表中,按照数字出现的次数从大到小排序,如果次数相等,则按照数字从小到大排序。

代码实现
def top_k_frequent_numbers(A, k):
    """
    给定一个整数数组A和一个整数k,找到A中前k个最常见的元素。
    """
    # Step 1: 计算每个数字在数组A中的出现次数
    freq = {}
    for number in A:
        if number in freq:
            freq[number] += 1
        else:
            freq[number] = 1
    
    # Step 2: 按照出现次数排序,如果次数相等,按照数字排序
    sorted_freq = sorted(freq.items(), key=lambda x: (-x[1], x[0]))
    
    # Step 3: 返回前k个数字
    return [number for number, _ in sorted_freq[:k]]
时间复杂度

遍历数组A需要O(n)的时间,将数字添加到字典中需要O(1)的时间,因此计算每个数字在数组A中出现次数的时间复杂度为O(n)。对字典中的数字按照出现次数排序的时间复杂度为O(nlogn),因此总的时间复杂度为O(nlogn)。

测试样例
assert top_k_frequent_numbers([3,1,1,2,2,1,4,4,4,4], 3) == [1,2,4]
assert top_k_frequent_numbers([3,3,2,2,1,1,1], 2) == [1,3]
assert top_k_frequent_numbers([1]*10000+[2]*10000, 1) == [1]