Java 中不同子序列的 GCD2024年9月10日 | 阅读 6 分钟 给定一个包含正数的数组 inArr。任务是找到输入数组中所有存在的子序列中不同的 GCD(最大公约数)的数量。注意,数组的子序列是通过一次选取一个或多个元素形成的。 示例 1 输入 int inArr[] = {6, 8, 10} 输出 4 解释:输入数组的不同子序列及其 GCD 为 对于子序列 {6},GCD 为 6。 对于子序列 {8},GCD 为 8。 对于子序列 {10},GCD 为 10。 对于子序列 {6, 8},GCD 为 2。 对于子序列 {8, 10},GCD 为 2。 对于子序列 {6, 10},GCD 为 2。 对于子序列 {6, 8, 10},GCD 为 2。 因此,所有计算出的 GCD 为 6、8、10、2、2、2、2,其中只有 4 个是唯一的(6、8、10、2)。因此,输出为 4。 示例 2 输入 int inArr[] = {2, 4, 8} 输出 3 解释:输入数组的不同子序列及其 GCD 为 对于子序列 {2},GCD 为 2。 对于子序列 {4},GCD 为 4。 对于子序列 {8},GCD 为 8。 对于子序列 {2, 4},GCD 为 2。 对于子序列 {4, 8},GCD 为 4。 对于子序列 {2, 8},GCD 为 2。 对于子序列 {2, 4, 8},GCD 为 2。 因此,所有计算出的 GCD 为 2、4、8、2、4、2、2,其中只有 3 个是唯一的(2、4、8)。因此,输出为 3。 方法:暴力法在此方法中,我们将计算输入数组的所有子序列,并将这些子序列存储在 ArrayList 中。然后,我们将计算存储在 ArrayList 中的所有子序列的 GCD,并将它们放入一个 Set 中。由于 Set 只包含唯一元素,Set 的大小就是我们的答案。为了找到子序列,我们将使用递归。观察以下程序。 文件名:DiffSubseqGCD.java 输出 For the input array: 6 8 10 The total number of unique GCDs is: 4 For the input array: 2 4 8 The total number of unique GCDs is: 3 复杂度分析:每次递归调用都会导致另外两次递归调用。因此,程序的 time complexity 是指数级的。程序的 space complexity 也是指数级的。 上述程序不适用于较大的输入,因为程序的 time complexity 和 space complexity 都太高了。因此,我们必须进行一些优化来降低 time complexity 和 space complexity。 高效方法使用贪心方法,我们可以进行优化。我们必须利用这样的事实:任何两个数字 n1 和 n2 的 GCD 介于 1 到 max(n1, n2) 之间,并且对于包含两个以上元素的任何子序列,相同的概念也成立。如果子序列中的最大元素是 M,则 GCD 始终落在 [1, M] 的范围内。因此,我们可以从 1 到 M 进行迭代,如果给定范围内的任何数字是数组中某个元素的因子,那么我们可以将该元素显示为 GCD 的一个结果。 文件名:DiffSubseqGCD1.java 输出 For the input array: 6 8 10 The total number of unique GCDs is: 4 For the input array: 2 4 8 The total number of unique GCDs is: 3 复杂度分析:程序的 time complexity 为 O(Max * log(Max)),其中 Max 是数组的最大元素。程序的 space complexity 为 O(N),其中 N 是 ArrayList 中存在的元素总数。 |
java.time.format.DecimalStyle 类是 getDecimalSeparator() 方法。使用 DecimalStyle 类获取用于表示此 DecimalStyle 的 Locale 的小数分隔符的字符。该过程返回该区域设置的十进制分隔符的字符。语法:public char getDecimalSeparator() 参数:无参数...
阅读 2 分钟
在编程世界中,模拟现实世界场景既有趣又有教育意义。其中一个场景是掷骰子,这是机会游戏中常见的元素。在本节中,我们将探讨如何创建一个 Java 程序来模拟掷 N 个骰子……
阅读 4 分钟
拼写检查器是文本处理应用程序的重要组成部分,其中会使用字典验证每个单词的正确性,并在出现拼写错误时建议正确的文本拼写。在本节中,我们将解释如何改进……
阅读9分钟
继承的概念代表了面向对象编程 (OOP) 在 Java 中的四个基本方面之一。通过继承机制,子类可以接收其超类的所有字段和方法。该功能使开发人员能够重用代码块,并创建可维护且可扩展的...
5 分钟阅读
抽象语法树是一种表示计算机语言的抽象语法结构的树。树的每个节点都表示源代码中存在的构造。通常,AST 是编译器语法...的输出。
阅读 3 分钟
如今,系统都配备了多核处理器。多核处理器可以加快计算速度。因此,程序员有必要有效地利用多核处理器,以便在更短的时间内生成结果。Java 中的 Fork/Join 用于实现...
5 分钟阅读
帕斯卡三角形是一个二项式系数的三角形模式,其中每个元素是其正上方两个数字之和。在Java中,可以通过多种方法生成它,包括阶乘方法(nCr公式)和迭代方法,后者利用了帕斯卡恒等式。该...
阅读 6 分钟
Java 中的 main() 方法是程序执行的入口点。Java 应用程序通过 JVM 调用此预定义的、具有签名 public static void main(String[] args) 的方法来启动执行。程序员经常想知道 Java 程序是否可以有多个 main() 方法……
5 分钟阅读
java.text.RuleBasedCollator 类有一个 equals() 函数。Collator 类用于确定提供的两个字符串是否相同。语法:public boolean equals(String source, String target) 参数:此方法需要两个字符串来比较两个字符串。返回……
阅读 2 分钟
() 和 Line() 之间的区别 在 Java 中,java.util 包中提供的 Scanner 类是获取 int、double 和字符串等原始数据类型输入的最简单方法之一。在竞技编程中,时间是一个限制因素,使用 Scanner 类是...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India