Java 中 K 个最频繁元素2024年9月10日 | 11 分钟阅读 给定一个整数数组。还给了一个数字 K。我们的任务是找出给定整数数组中 K 个最频繁的元素。 示例:1 输入 Int arr[] = {5, 5, 3, 7, 9, 7, 0, 1, 2, 7}, int k = 2 输出 {5, 7} 解释:出现次数最多的前两个元素是 7(3 次)和 5(2 次)。输出显示了相同的内容。 示例:2 输入 Int arr[] = {9, 2, 0, 1, 4, 8, 6, 3, 0, 1, 5, 4, 4, 1, 7}, int k = 3 输出 {0, 1, 4} 解释:出现次数最多的前三个元素是 0(2 次)、1(3 次)和 4(3 次)。输出显示了相同的内容。 方法:使用部分排序在这种方法中,我们将问题分解成更小的问题。显然,第 K 个最频繁的元素是(n - K)个最不频繁的元素。因此,我们对从最不频繁的元素到最频繁的元素进行部分排序,直到第(n - K)个最不频繁的元素占据排序数组中的第(n - K)个位置。我们通过快速选择来实现这一点。请注意以下步骤。 步骤 1:创建一个哈希映射,其中键是元素,值是该元素在输入数组中出现的频率。 步骤 2:使用循环遍历元素,并在上一步创建的哈希映射中将其值加 1。 步骤 3:将 len 设置为“MAP.SIZE”。 步骤 4:创建一个名为 temp 的数组,其中将包含整数,并将哈希映射的所有键插入其中。 步骤 5:调用方法 quickSel(0, 'len' - 1, len - 'K')。 步骤 6:返回数组 temp 中从索引 (len - K) 到 len 的元素。 在方法 quickSel(lft, rght, kSml') 中,执行以下操作:
观察基于上述步骤的以下实现。 文件名: KMostFreq.java 输出 For the input array: 5 5 3 7 9 7 0 1 2 7 The first 2 frequent elements are: 5 7 For the input array: 9 2 0 1 4 8 6 3 0 1 5 4 4 1 7 The first 3 frequent elements are: 0 1 4 复杂度分析:在最坏的情况下,枢轴不会将问题平分。因此,时间复杂度为 O(n2)。但是,在大多数情况下,这种情况的可能性很小。因此,程序的平均时间复杂度为 O(n)。由于使用了哈希映射,因此程序的空间复杂度为 O(n),其中 n 是输入数组中存在的元素总数。 方法:使用堆我们将根据元素在数组中出现的次数对数组进行排序。我们将使用一个哈希映射,其中键是元素本身,值是元素在输入数组中出现的次数。然后,我们将使用堆根据元素出现的次数以降序对输入数组的元素进行排序。涉及的步骤如下所述。 步骤 1:如果 K 的值等于输入数组的大小,则返回输入数组。 步骤 2:创建一个哈希映射,其中键是元素,值是该元素在输入数组中出现的频率。 步骤 3:使用循环遍历元素,并在上一步创建的哈希映射中将其值加 1。 步骤 4:创建一个优先队列 pq,以便按元素频率的降序对将要排序的元素进行排序。 步骤 5:将所有键添加到映射中,然后添加到堆中。 步骤 6:创建一个数组 temp[] 用于存储答案 步骤 7:将堆的前 k 个元素添加到数组 temp 中,然后返回数组 temp。 以下实现使用了上述步骤。 文件名: KMostFreq1.java 输出 For the input array: 5 5 3 7 9 7 0 1 2 7 The first 2 frequent elements are: 7 5 For the input array: 9 2 0 1 4 8 6 3 0 1 5 4 4 1 7 The first 3 frequent elements are: 1 4 0 复杂度分析:创建哈希映射需要 O(N) 时间,在最坏的情况下,构建堆需要 O(n x log(n)) 时间,因为向堆添加元素需要 log(n) 时间。因此,程序的总时间复杂度为 O(n x log(n)),其中 n 是输入数组中存在的元素总数。程序的空间复杂度与上一个程序相同。 让我们进一步优化以降低时间复杂度。 方法:使用桶排序显然,一个元素在输入数组中最多可以出现 n 次,最少可以出现 1 次。因此,我们可以创建 n 个桶,并将元素根据它们出现的频率放入桶中。例如,如果一个数字出现 t 次,那么它将进入 bucketArr[t] 桶。将所有元素放入桶后,从最右侧桶开始的 k 个元素就是我们的解决方案。 算法 步骤 1:创建一个哈希映射,其中键是元素,值是该元素在输入数组中出现的频率。 步骤 2:使用循环遍历元素,并在上一步创建的哈希映射中将其值加 1。 步骤 3:创建一个名为 bucketArr[] 的数组。 步骤 4:根据其出现频率将哈希映射的所有键添加到 bucketArr[] 中。 步骤 5:创建一个 temp[] 数组用于存储答案。 步骤 6:从最右侧的桶开始,将 'K' 个元素添加到 temp[] 数组中。 步骤 7:返回数组 temp。 文件名: KMostFreq2.java 输出 For the input array: 5 5 3 7 9 7 0 1 2 7 The first 2 frequent elements are: 7 5 For the input array: 9 2 0 1 4 8 6 3 0 1 5 4 4 1 7 The first 3 frequent elements are: 1 4 0 复杂度分析:该程序仅在特定时间段内遍历输入数组。因此,程序的时间复杂度为 O(n),其中 n 是数组中存在的元素总数。程序的空间复杂度与上一个程序相同。 下一个主题Java 中的并行编程 |
队列是计算机科学和编程中使用的基本数据结构。它们遵循“先进先出”(FIFO)原则,其中第一个传入的对象可以先移除。许多编程语言,包括 Java,通过 Queue 接口实现队列。Queue 接口提供了多种方法...
阅读 4 分钟
给出了一个数字 n。我们的任务是找出 1 到 n 之间存在的自描述数字。自描述数字 m 是一个数字,它在基数 b 中包含 b 个数字,其中最高有效数字位于 0 位置,...。
5 分钟阅读
质因数分解是数论中的一个基本概念,它涉及将一个合数分解为其最小的质因数。这个过程在密码学和数论等数学和计算机科学的各个领域都非常宝贵。在本节中,我们将探讨如何...
阅读 4 分钟
当 I/O 操作尝试发生在已关闭的通道上,或者通道对预期操作已关闭时,会触发 ClosedChannelException 类。也就是说,如果抛出此异常。然而,这并不意味着通道已完全关闭,只是意味着...
阅读 4 分钟
在 Java 中,所有给定序列的最长公共子序列称为。使用 LCS 的原因是限制子序列的元素在原始序列中占据连续的位置。在原始序列中以相同相对...的序列。
阅读 4 分钟
在 Java 中,数据类型指定值的大小和类型。它用于存储标识符的浮点值。数据类型分为两大类:基本类型和非基本类型。基本数据类型包括所有预定义的数据类型,如 Integer、Character、Boolean、...
阅读 4 分钟
给定一个非负整数数组,其中每个数字出现的次数都是偶数,只有一个数字出现的次数是奇数。任务是找出出现次数是奇数的那个数字。例如:输入:a[] = {7,...
阅读9分钟
在本节中,我们将学习什么是 xylem(木质部)和 phloem(韧皮部)数,并创建 Java 程序来检查给定的数字是 xylem 还是 phloem。xylem 和 phloem 数的程序经常出现在 Java 编码测试和学术界。Xylem 和 Phloem 数 一个数字 N...
阅读 2 分钟
Java 框架是 Java 开发人员用于开发 Java 应用程序或 Web 应用程序的预写代码的身体或平台。换句话说,Java 框架是一组预定义的类和函数,用于处理输入、管理硬件设备并与系统交互……
阅读 4 分钟
泛化和特化是面向对象编程(OOP)中的两个重要概念。泛化是从具体概念到更一般概念的过程。特化是从一般概念到更具体概念的过程。在 Java 中,泛化和特化是通过...实现的。
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India