要得到k个最小元素,可以使用以下两种方法:
推荐腾讯云相关产品:
题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。...分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。...我们可以先创建一个大小为k的数据容器来存储最小的k个数字。接下来我们每次从输入的n个整数中读入一个数。...如果待插入的值比当前已有的最大值小,则用这个数替换替换当前已有的最大值;如果带插入的值比当前已有的最大值还要大,那么这个数不可能是最小的k个整数之一,因为我们容器内已经有k个数字比它小了,于是我们可以抛弃这个整数...于是我们每次可以在O(1)得到已有的k个数字中的最大值,但需要O(logk)时间完成删除以及插入操作。 我们自己从头实现一个最大堆需要一定的代码。我们还可以采用红黑树来实现我们的容器。
/ 给你一个字符串 num 和一个整数 k 。...其中,num 表示一个很大的整数,字符串中的每个字符依次对应整数上的各个 数位 。 你可以交换这个整数相邻数位的数字 最多 k 次。 请你返回你能得到的最小整数,并以字符串形式返回。...示例 1: 输入:num = "4321", k = 4 输出:"1342" 解释:4321 通过 4 次交换相邻数位得到最小整数的步骤如上图所示。...---- 目录: 理解题意 → 递归解法 → 优化递归 → 优化到O(N logN) ---- 理解题意 首先根据题目描述,我们可以得到: 要想在移动 k 次之后得到最小的数, 必须每次移动尽可能的在...所以移动之后得到: num = 1432, k = 4 - 3 = 1; 然后从 1 后面开始,我们能找到的 2, 把 2 移动到 1 后面需要移动 2 次, 但是 k = 1, 所以我们得找下一个小的数
LeetCode 347 前 K 个高频元素 题目描述 给定一个非空的整数数组,返回其中出现频率前 高的元素。...样例 样例输入1 nums = [1,1,1,2,2,3], k = 2 样例输出1 [1,2] 样例输入2 nums = [1], k = 1 样例输出2 [1] 算法与数据结构 优先级队列
LeetCode 347 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。...示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 提示: 1 <= nums.length...<= 105 k 的取值范围是 [1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的 思路: 1. map 进行统计,出现的次数, 2....输出的前 K 个值就是 前 K 个高频元素 AC 代码 class Solution { public int[] topKFrequent(int[] nums, int k) {...; int j = 0; for(int i = 0; i < k;i++){ result[j++] = list.get(i).getKey
一 题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。...示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 二 思路: 使用小根堆来保留出现次数最多的k个数,堆顶为最多的k个数里的最小值 排序规则采用外部的map...进行关联 三 代码: class Solution { public int[] topKFrequent(int[] nums, int k) { //统计每个数字的数量...,堆顶保留的k个最大的里面的最小值 final PriorityQueue queue = new PriorityQueue(Comparator.comparingInt...//小根堆排序 numCount.forEach((key, value) -> { if (queue.size() < k)
题目: 给定一个非空的整数数组,返回其中出现频率前 K 高的元素。...总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...解题思路: 这道题大致解题步骤是: 频率统计 --> 按频率排序 --> 返回频率最高的前 K 个元素 注意点: 题目要求时间复杂度优于 O(n log n) 首先频率统计最优雅的方法应该是借助哈希映射...重点是返回前 K 个频率最高的元素, 所以另一种更简单的方法是直接借助 堆(优先队列) 这种数据结构 维护一个 大小为 K 的堆来动态存储前 K 个频率最高的元素, 其时间复杂度为 O(n) 代码:...heapq 堆数据结构, 有两个函数: nlargest nsmallest 例如 heapq.nsmallest(n, nums) 表示取迭代器 nums 前 n 个最大元素, 该函数还能接受一个
序 本文主要记录一下leetcode哈希表之前K个高频元素 题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。...k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。...result; } } 小结 这里先借助HashMap来统计元素出现的频次,然后再借助PriorityQueue来维护topK的元素,最后取出来topK元素转换为数组。...doc 前K个高频元素
题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 提示: 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。...示例 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 示例 3: nums = [...基本思路是先把元素和元素个数存入字典, 然后反转key-value. 因为value 有重复的情况, 所以把重复对应的key以List形式作为值....int]: rd = {} # type: Dict[int, int] cd = {} # type: Dict[int, List[int]] # 把元素和元素个数对存入字典
如何使用优先队列解决这个问题呢,可以使用优先队列,维护当前看到的前M个元素。...需要注意的是这里虽然要选出前M个元素,前M个元素默认是前M个最大的元素,但是实际上需要的是一个最小堆,我们要能够非常快速的取出当前看到的前M个元素中的最小的那个元素,我们不断的将当前可以看到的前M大的元素中那个最小的元素进行替换...k个频次最高的元素, 114 // 此时,新遍历的一个key,此时这个key的频次可能比当前这前k个频次最高的元素中 115 // 那个频次最小的那个元素的频次更高...k个频次最高的元素, 95 // 此时,新遍历的一个key,此时这个key的频次可能比当前这前k个频次最高的元素中 96 // 那个频次最小的那个元素的频次更高...k个频次最高的元素, 64 // 此时,新遍历的一个key,此时这个key的频次可能比当前这前k个频次最高的元素中 65 // 那个频次最小的那个元素的频次更高
# LeetCode-347-前K个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。...,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。...# 解题思路 方法1、最小堆: 首先利用Map来计算数组中数字出现的频率 之后利用一个优先队列,在存储的过程中按照频率进行排序,且只存储频率最高的前K个数 由于题目要求的顺序可以不同,所以最后一次弹出queue...第二步建立堆,堆中添加一个元素的复杂度是 O(log(k)),要进行 N 次复杂度是 O(N)。 最后一步是输出结果,复杂度为 O(klog(k))。第二步和最后一步复杂度综合O(Nlog(k))。
虽然tag是中等难度,感觉还是比较简单的,不难想到对每一个数记录它的出现次数,然后按照出现次数从大到小排序输出就好了,主要是实现方法,这里我用了的是map+vector+pair,用时已经是我最快的了...---- AC代码: class Solution { public: vector topKFrequent(vector& nums, int k) {...return a.first < b.first; return a.second > b.second; }); for(int i=0;i<k;
前 K 个高频元素) https://leetcode-cn.com/problems/top-k-frequent-elements/ 题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前...k 高的元素。...示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 提示: 1 <=...nums.length <= 105 k 的取值范围是 [1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的 进阶:你所设计算法的时间复杂度...) -> List[int]: from collections import Counter counter = Counter(nums).most_common(k)
1,问题简述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。...2,示例 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 提示: 你可以假设给定的...k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。...array; } } 5,题解程序图片版 6,总结 hashMap键值对集合加上堆排序的使用,也算是堆,即优先级队列的使用吧,一般自己的写法都是很常规的写法,所以看懂java语法就知道怎么个意思了
1,问题简述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。...2,示例 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 提示: 你可以假设给定的...k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。 3,题解思路 键值对集合使用。...{ public static void main(String[] args) { int[] nums = {1, 1, 1, 2, 2, 3}; int k
我们知道,在Python里面,可以使用 max和 min获得一个列表的最大、最小的元素: a = [4, 2, -1, 8, 100, -67, 25]max_value = max(a)min_value...= min(a) print(max_value)print(min_value) 运行效果如下图所示: 那么问题来了,如何获取最大的3个元素和最小的5个元素?...你当然可以先排序,然后再取: a = [4, 2, -1, 8, 100, -67, 25, 3, 4, 5, 6, 7, 55]a.sort() print(f'最小的5个元素:{a[:5]}')print...(f'最大的三个元素:{a[-3:]}') 那有没有其他办法呢?...:{max_three}')print(f'最小的5个元素:{min_five}') 运行效果如下图所示: 这里的 heapq是一个用于处理 堆这种数据结构的模块。
# LeetCode-347-前K个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。...总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。...# 解题思路 方法1、最小堆: 首先利用Map来计算数组中数字出现的频率 之后利用一个优先队列,在存储的过程中按照频率进行排序,且只存储频率最高的前K个数 由于题目要求的顺序可以不同,所以最后一次弹出queue...第二步建立堆,堆中添加一个元素的复杂度是 O(log(k)),要进行 N 次复杂度是 O(N)。 最后一步是输出结果,复杂度为 O(klog(k))。第二步和最后一步复杂度综合O(Nlog(k))。
原题 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。...总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...,检查一下堆的个数是否超过 k,如果超过,则移除堆顶的元素(也就是次数最少的元素)。...桶排序优化 针对排序,我想到了一个优化,利用桶排序,其时间复杂度为O(n),主要是浪费空间,因为需要申请额外的数组,下标代表出现的次数,元素我用的是 LinkedList,这样可以存储多个。...array[count] = list; } list.add(key); } // 倒着遍历数组,直到找到K个元素
序 本文主要记录一下leetcode哈希表之前K个高频元素 OIP (63).jpeg 题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。...k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。...result; } } 小结 这里先借助HashMap来统计元素出现的频次,然后再借助PriorityQueue来维护topK的元素,最后取出来topK元素转换为数组。...doc 前K个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。...<= 105 k 的取值范围是 [1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的 进阶:你所设计算法的时间复杂度 必须 优于 O(n log...=h.cap/2;k>=0;k--{ h.adjust(k) } } } func (h *heap)adjust(i int){ for i<h.cap...else{ break } } } 源码: 解法二: 解题思路 1,将数组转化成数字、频次对 2,我们知道快速排序的复杂度是nlogn,且每一次排序后,pivot前面的元素都比...pivot大,后面的都比pivot小 3,类比这个思路: A,pivot==k,pivot前面的元素就是所求,得解 B,pivot>k,我们继续在0到 pivot 之间寻找 C,pivot<k 我们在
return a.second >= b.second; } }; vector topKFrequent(vector& nums, int k)...& num : nums) val2cnt[num]++; for (auto& [val, cnt] : val2cnt) { if (q.size() < k)...q.emplace(val, cnt); else if (q.size() == k && cnt > q.top().second) {
领取专属 10元无门槛券
手把手带您无忧上云