📌  相关文章
📜  国际空间研究组织 | ISRO CS 2020 |问题 69(1)

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

国际空间研究组织 | ISRO CS 2020 |问题 69

问题描述

给定n个整数和一个整数k,找到这n个整数中至少出现了k次的元素,并按照其出现次数排序。如果出现次数相等,则它们应按插入顺序排序。

函数签名
def k_frequency(arr: List[int], k: int) -> List[Tuple[int, int]]:
    pass
输入
  • arr:长度为n (1 ≤ n ≤ 10^5),表示n个整数的列表。
  • k:一个整数 (1 ≤ k ≤ n)
输出
  • 一个列表,其中包含整数和它们出现的次数的元组,它们按出现次数递减排列,如果出现次数相同,则按它们在原始列表中出现的顺序进行排序。
示例

输入:

arr = [3, 1, 4, 4, 5, 2, 6, 1]
k = 2

输出:

[(4, 2), (1, 2)]
解释

在给定的列表中,数字14至少出现了2次。

实现方法

本问题可以分解为以下几个步骤:

  1. 统计元素出现的次数
  2. 按出现次数排序
  3. 如果出现次数相等,则按它们在原始列表中的顺序进行排序
步骤1

为统计每个元素出现的次数,我们可以使用python内置的Counter工具。

from collections import Counter

def k_frequency(arr: List[int], k: int) -> List[Tuple[int, int]]:
    counter = Counter(arr)
    print(counter)

得到统计结果:

Counter({4: 2, 1: 2, 3: 1, 5: 1, 2: 1, 6: 1})
步骤2

按出现次数递减排序,我们可以对前面得到的Counter结果进行排序。

from collections import Counter

def k_frequency(arr: List[int], k: int) -> List[Tuple[int, int]]:
    counter = Counter(arr)
    counts = sorted(counter.items(), key=lambda x: x[1], reverse=True)
    print(counts)

得到排序结果:

[(4, 2), (1, 2), (3, 1), (5, 1), (2, 1), (6, 1)]
步骤3

如果出现次数相同,则按它们在原始列表中的顺序进行排序。

from collections import Counter
from typing import List, Tuple

def k_frequency(arr: List[int], k: int) -> List[Tuple[int, int]]:
    counter = Counter(arr)
    counts = sorted(counter.items(), key=lambda x: (-x[1], arr.index(x[0])))
    result = []
    for i, (val, count) in enumerate(counts):
        if count < k:
            break
        result.append((val, count))
    return result
复杂度分析

本算法的时间复杂度为$O(nlogn)$,其中n为元素个数。

  • 统计元素个数的时间复杂度为$O(n)$
  • 对元素进行排序的时间复杂度为$O(nlogn)$

空间复杂度为$O(n)$,主要用于存储元素出现的次数。