Java 中的平方数组数量2024年9月10日 | 阅读 9 分钟 提供一个仅包含正数的数组作为输入。我们需要找出数组的平方数排列的总数。当相邻两个元素的和是一个完全平方数时,该数组被称为平方数数组。 示例 1 输入 int inArr[] = {1, 3, 6} 输出 2 解释 对于给定的数组,有 6 种可能的排列:{1, 3, 6}, {1, 6, 3}, {3, 1, 6}, {3, 6, 1}, {6, 1, 3}, {6, 3, 1}。在所有这些排列中,只有 {1, 3, 6} 和 {6, 3, 1} 构成了平方数数组。对于 {1, 3, 6},我们有 1 + 3 = 4 (22) 和 3 + 6 = 9 (32);对于 {6, 3, 1},我们有 6 + 3 = 9 (32) 和 1 + 3 = 4 (22)。 示例 2 输入 int inArr[] = {24, 48, 1} 输出 2 解释 对于给定的数组,有 6 种可能的排列:{1, 24, 48}, {1, 48, 24}, {24, 1, 48}, {24, 48, 1}, {48, 1, 24}, {48, 24, 1}。在所有这些排列中,只有 {24, 1, 48} 和 {48, 1, 24} 构成了平方数数组。对于 {24, 1, 48},我们有 24 + 1 = 25 (52) 和 1 + 48 = 49 (72);对于 {48, 1, 24},我们有 48 + 1 = 49 (72) 和 1 + 24 = 25 (52)。 示例 2 输入 int inArr[] = {0, 0, 4, 0, 0} 输出 5 解释 对于给定的数组,有 5 种可能的排列:{0, 0, 0, 0, 4}, {0, 0, 0, 4, 0}, {0, 0, 4, 0, 0}, {0, 4, 0, 0, 0}, {4, 0, 0, 0, 0}。所有这些排列都是平方数数组。对于 {0, 0, 0, 0, 4},我们有 0 + 0 = 0 (02),0 + 0 = 0 (02),0 + 0 = 0 (02),0 + 4 = 4 (22)。其他排列也可以给出类似的逻辑。 简单方法:暴力法在这种方法中,我们检查输入数组的所有排列。对于输入数组 'inAr' 中的每个排列,检查 inAr[j] + inAr[j+1] 是否为完全平方数。如果是完全平方数,则将 ans 加 1。然后返回 ans。 算法
现在观察以下实现。 文件名: SquarefulArrays.java 输出 For the input array: 0 0 0 0 4 The number of Squareful array is: 5 For the input array: 1 3 6 The number of Squareful array is: 2 For the input array: 24 48 1 The number of Squareful array is: 2 复杂度分析: 对于 N 大小的数组,总共有 N! 种排列。我们检查所有排列,每个排列的大小为 N。因此,程序的总时间复杂度为 O(N! * N)。程序空间复杂度为 O(1),因为程序不使用任何额外的空间。 程序的 time complexity 非常高,不适合较大的输入。因此,需要进行一些优化。观察以下方法。 方法:动态规划构建一个图,其中如果 inAr[j] + inAr[k] 是完全平方数,则从 j 到 k 存在一条边。然后,计算所有可能的哈密顿路径。哈密顿路径的总数将等于平方数排列的数量。 哈密顿路径是图中两个顶点之间的图路径,该路径至少访问图中的所有顶点一次。 我们将构建一个图,其中在 'j' 和 'k' 之间存在一条边,仅当 inAr[j] + inAr[k] 是完全平方数时。我们可以使用动态规划技术来检查哈密顿路径。 算法步骤 1:我们将首先消除重复项,只考虑索引排列。P[B, j] 表示已使用的数字数量为 'B' 时,inAr[j] 是最后一个数字的总排列数。 步骤 2: 'B' 是二进制数,其中每一位表示 'j' 是否存在。 步骤 3: 开始时,P[1 << j, j] = 1。其他状态为 0。 步骤 4: 每次,枚举 'k'。
步骤 5: 使用一个变量 'ans'。将其赋值为 0。 步骤 6: 使用 'j' 从 0 迭代到 's',其中输入数组 'inAr' 的大小为 's'。
步骤 7: 需要对重复的元素计数一次。因此,将 'ans' 除以 'inAr[]' 中每个数字的计数阶乘。 文件名:SquarefulArrays.java 输出 For the input array: 0 0 0 0 4 The number of Squareful array is: 5 For the input array: 1 3 6 The number of Squareful array is: 2 For the input array: 24 48 1 The number of Squareful array is: 2 复杂度分析: 总共有 'N x 2N' 个状态,每个状态最多有 'N' 个子节点。此外,每个子节点至少被遍历一次。因此,程序的总时间复杂度为 O(N2 x 2N)。此外,程序使用二维数组 'P',这使得程序的空间复杂度为 O(N x 2N),其中 N 是输入数组的大小。 |
Java 是一种多功能且广泛使用的编程语言,以其丰富的库和强大的功能而闻名。其中一项功能是 Icon 接口,它允许开发人员创建对象的动态图形表示。在本节中,我们将深入探讨 Java 中的 Icon 接口,...
5 分钟阅读
这是非常有趣的问题,经常出现在 Google、Amazon、TCS、Accenture 等顶级 IT 公司的面试中。通过解决问题,人们想检查面试者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,我们将...
阅读 8 分钟
名为 Java.util.concurrent.atomic.AtomicIntegerArray.set() 的内置 Java 函数允许您在 AtomicIntegerArray 的任何位置设置值。此函数通过提供 AtomicIntegerArray 的索引值作为参数来修改指定索引处的值。上述方法不返回值....
阅读 3 分钟
程序正常运行过程中发生的令人惊讶的、不幸的事件称为异常。一般来说,异常是由我们的程序产生的,并且是可恢复的。除非我们的程序需要检查远程报告中安排的数据...
阅读 4 分钟
Java 多重继承(也称为多次类型转换)是指在变量上连续应用多个类型转换操作的过程。这通常发生在数据类型不兼容但需要转换才能使代码正常运行时。多重继承在面向对象中特别有用...
阅读 4 分钟
在本文中,我们将研究 JAVA 编程语言中的异步调用。在文章的最后,我们将清晰地了解异步调用以及它与 JAVA 编程语言中的同步调用有何不同。首先,我们...
阅读 8 分钟
A 是一个访问修饰符。它可以分配给变量、方法、构造函数和类。它是最不受限制的访问修饰符类型。要点:公共访问修饰符在任何地方都可访问。因此,我们可以轻松地在类内部和外部访问公共...
阅读 3 分钟
有多种方法可以处理字符串。一项常见的任务是反转给定字符串中的短语。在本节中,我们将探讨如何在 Java 中实现这一点。首先,让我们定义“反转交换”的含义...
5 分钟阅读
在并发编程领域,管理共享数据和确保线程安全是关键方面。Java 作为一种流行的编程语言,提供了强大的功能来处理并发。其中一个概念是 Concurrent Array,它允许多个线程并发访问和修改元素,而无需...
阅读 4 分钟
给定一个整数数组(或数组列表)。我们的任务是打印给定整数数组的所有子集(不包括空子集)。请注意,显示子集的顺序无关紧要。示例 1:输入 int inputArr[] = {1, 2, 3} 输出:{1}、{2}、...
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India