问题描述
给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。
你所设计算法的时间复杂度必须优于 O(n log n),其中 n 是数组大小。
输入
- nums: 一个正整数数组
- k: 一个整数
返回
返回一个包含 k 个元素的字符串,数字元素之间用逗号分隔。数字元素按升序排列,表示出现频率最高的 k 个元素。
参数限制
- 1 <= nums[i] <= 10^4
- 1 <= nums.length <= 10^5
- k 的取值范围是 [1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
测试样例
样例1:
输入:
nums = [1, 1, 1, 2, 2, 3], k = 2
输出:"1,2"
解释:元素 1 出现了 3 次,元素 2 出现了 2 次,元素 3 出现了 1 次。因此前两个高频元素是 1 和 2。
对于这道题,我的理解是这样的:
from collections import Counterdef solution(nums, k): p = Counter(nums) # 获取前 k 个最常见的元素 most_common_elements = p.most_common(k) # 只提取元素,不需要排序 result = [num for num, count in most_common_elements] # 将结果列表转换为字符串,并用逗号分隔 result_str = ','.join(map(str, result)) return result_strif __name__ == "__main__": # You can add more test cases here print(solution([1,1,1,2,2,3], 2)) # 输出: "1,2" print(solution([1], 1)) # 输出: "1" print(solution([4,4,4,2,2,2,3,3,1], 2)) # 输出: "4,2"
问题理解
给定一个整数数组 nums 和一个整数 k,要求返回出现频率前 k 高的元素,并以字符串形式返回,元素之间用逗号分隔。
数据结构选择
-
**
Counter**:- 使用
collections.Counter来统计每个元素的出现频率。Counter是一个字典子类,用于计数可哈希对象。
- 使用
-
**
most_common(k)**:Counter对象的most_common(k)方法返回一个列表,其中包含前k个最常见的元素及其频率。
算法步骤
-
统计频率:
- 使用
Counter统计数组中每个元素的出现频率。
- 使用
-
获取前
k个最常见的元素:- 使用
most_common(k)方法获取前k个最常见的元素及其频率。
- 使用
-
提取元素:
- 从
most_common(k)返回的列表中提取元素,忽略频率。
- 从
-
转换为字符串:
- 将提取的元素列表转换为字符串,并用逗号分隔。
这样就可以将一个整数数组中出现频率前 k 高的元素提取出来,并以字符串形式返回,元素之间用逗号分隔。这样,你就可以满足题目的要求。虽然最后的答案好像有些瑕疵,不能完全算ac了。(记得注意这个内容:题目数据保证答案唯一,数组中前 k 个高频元素的集合是唯一的)
但是对于题目的理解还是没有问题的,当给定一个整数时,我们需要返回前k高频率的字符,可以使用 collections.Counter 来统计每个元素的出现频率。Counter 是一个字典子类,用于计数可哈希对象,从 most_common(k) 返回的列表中提取元素,忽略频率,将提取的元素列表转换为字符串,并用逗号分隔,这样就可以将一个整数数组中出现频率前 k 高的元素提取出来,并以字符串形式返回。
其实在力扣中好像也见到了类似的题目,就是不知道准不准确,这样的思路还是值得学习的!!