Java 中数组中最长可整除子集的大小2024 年 9 月 10 日 | 阅读 7 分钟 在给定的输入数组中,任务是找出最长可整除子集的大小。当一个子集中的任意一对元素 (p, q) 满足 p 能整除 q (p % q = 0) 或 q 能整除 p (q % p = 0) 时,该子集被称为可整除子集。 示例 1 输入 int arr[] = {1, 16, 7, 19, 28, 8, 4, 64, 256} 输出 6 解释:考虑子集 {1, 16, 8, 4, 64, 256}。在这个子集中,我们可以形成 15 个(6C2 = 15)元素对。在任意一对元素(由两个元素 p 和 q 组成)中,要么 p % q = 0,要么 q % p = 0。此外,所考虑的子集是满足给定条件的最长子集,其大小为 6。因此,输出为 6。 示例 2 输入 int arr[] = {2, 2, 2, 2, 2, 2, 2} 输出 7 解释:由于输入数组中的所有元素值都相同,因此它们可以完全互相整除。因此,最长子集就是输入数组本身,其大小为 7。因此,输出为 7。 方法:使用递归简单的方法是生成给定输入数组的所有可能子集,然后根据给定条件检查生成的子集是否有效。如果子集有效,则将其大小与之前计算的、之前计算过的有效子集的最大大小进行比较,并相应地更新答案。所有子集都可以通过排除或包含当前元素来生成。我们将同时生成和验证子集的大小。请看下面的实现。 文件名:LongestDivisibleSubset.java 输出 For the input array: 1 16 7 19 28 8 4 64 256 The maximum size of the longest divisible subset is: 6 For the input array: 2 2 2 2 2 2 2 The maximum size of the longest divisible subset is: 7 复杂度分析:该程序在每次递归调用中进行两次递归调用。这导致指数级时间复杂度。因此,程序的 time complexity 是 O(2n)。存储所有子集的数组列表(在本例中为 subsetAL)使 space complexity 呈指数级增长,也为 O(2n),其中 n 是输入数组中存在的总元素数。 上述程序的 time complexity 和 space complexity 都非常高,不适用于较大的输入。因此,需要降低这两种复杂度。 高效方法:使用排序通过排序,可以降低程序的 time complexity 和 space complexity。请看以下步骤。 步骤 1:将输入数组的所有元素按升序排序。排序的原因是为了确保一个元素的所有除数都出现在它之前。 步骤 2:创建一个大小与输入数组相同的数组 divisibleCount[]。divisibleCount[i] 存储以 arr[i] 结尾的可整除子集的大小(在排序后的数组中)。divisibleCount [i] 的最小值将为 1。 步骤 3:遍历所有数组元素。对于每个元素,找到一个除数 arr[j],使其 divisibleCount[j] 的值最大,并将 divisibleCount[i] 的值设置为 divisibleCount[j] + 1。 观察上述步骤的实现。 文件名:LongestDivisibleSubset1.java 输出 For the input array: 1 16 7 19 28 8 4 64 256 The maximum size of the longest divisible subset is: 6 For the input array: 2 2 2 2 2 2 2 The maximum size of the longest divisible subset is: 7 复杂度分析:该程序使用了两个嵌套的 for 循环,这使得程序的 time complexity 为 O(n2)。该程序还使用了辅助数组来查找结果,这使得程序的 space complexity 为 O(n),其中 n 是输入数组中存在的总元素数。 |
? 用户输入是任何应用程序的基本方面。它允许程序与用户交互,使其具有动态性和响应性。在 Java 中,有几种获取用户输入的方法,最常见的方法涉及 Scanner 类、BufferedReader 类和 Console...
5 分钟阅读
在编程中,打印不同形状和类型的星形图案可以是一个有趣的练习。打印此类图案的实践可以增强对嵌套循环的理解。因此,在本节中,我们将了解如何打印空心矩形或正方形星形图案……
7 分钟阅读
给定一个整数数组 a[] 和一个正整数 k,我们的任务是计算所有差值为 k 的不同对。示例 1:输入:int a[] = {1, 6, 7, 9, 3, 2, 8, 10} int k = 1 输出:差值为...的对的总数
14 分钟阅读
多线程编程的挑战之一是如何管理对共享资源的并发访问。为了解决这个问题,Java,一种以其强大的多线程支持而闻名的语言,内置了同步方法。Java 同步确保不同的线程可以使用公共资源或运行重要的……
5 分钟阅读
在编程世界中,一个高效可靠的集成开发环境 (IDE) 是一个关键工具。它提高了生产力,简化了开发,并为程序员提供了功能丰富的环境。随着云计算的出现,IDE 已成为开发人员实用且易于访问的选择...
阅读 3 分钟
零矩阵问题是一个经典的编程挑战,涉及根据矩阵中的零来操作矩阵,将所有行和列设置为零。这个问题不仅发人深省,而且在计算机科学和数据... 方面也有实际应用。
阅读 6 分钟
? 在 Java 编程中,枚举(enumeration 的缩写)是一种特殊的类型,它允许你定义一组固定的命名常量。枚举常量本质上是预定义的,可以用来表示一组特定的值,例如一周中的几天……
阅读 10 分钟
对数组中的内容进行排序,寻找数组中对象的排列,是计算机科学中的一种基本问题类型,可用于模式匹配技术、模拟、数据图形和可视化等应用。其中一项任务是对某些数值元素进行排序...
阅读 8 分钟
在 Java 中,一个有效的 final 变量不是用 final 关键字声明的,但它的值在初始赋值后不会改变。当处理 lambda 表达式和匿名内部类时,此概念至关重要,它们只能访问是...的局部变量。
7 分钟阅读
QuickSort 是一种高效的分治排序算法,它递归地将数组划分为较小的子数组。多线程允许在不同分区上并行执行排序,利用多个处理器核心来减少执行时间。它允许程序同时执行两个或多个部分以...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India