Java 中的最长和谐子序列2024年9月10日 | 阅读10分钟 给出了一个包含 n 个整数的数组。任务是找到数组的最长和谐子序列的大小。如果子序列中的最大值元素和最小值元素之间的差值为 1,则该子序列称为和谐子序列。 示例 1 输入 int inArr1[] = {11, 12, 12, 13, 14, 15, 11, 11, 11, 11} 输出 7 解释 最长的和谐子序列是 {11, 12, 12, 11, 11, 11, 11},其大小为 7。因此,输出为 7。 示例 2 输入 int inArr1[] = {0, 1, 5, 8, 10, 19, 15, 25, 30, 40, 45, 7, 11} 输出 2 解释 最长的和谐子序列是 {0, 1} 或 {7, 8},以及 {10, 11}。每个和谐子序列的大小为 2。因此,输出为 2。 蛮力法:使用位掩码概念是利用位掩码技术生成所有可能的子序列。对于每个子序列,检查它是否是和谐子序列。找出所有可能的有效子序列中的最大长度。 观察以下步骤 步骤 1: 定义一个变量 ans。将其初始化为 0。变量 "ans" 将包含最终答案。 步骤 2: 迭代 'j' 从 0 到 '2len - 1',其中 'len' 是输入数组 'inputArr[]' 的长度。
步骤 3: 返回答案 'ans'。 现在,让我们观察上述算法的实现。 文件名: LongestHarmoniousSubsequence.java 输出 For the input array: 11 12 12 13 14 15 11 11 11 11 The length of the longest Harmonic subsequence is: 7 For the input array: 0 1 5 8 10 19 15 25 30 40 45 7 11 The length of the longest Harmonic subsequence is: 2 复杂度分析: 程序生成 0 到 2len - 1 的所有二进制值。之后,程序遍历数组。因此,程序的整体时间复杂度为 O(len x 2len),其中 'len' 是输入数组的长度。此外,程序不使用额外的空间,因此空间复杂度为 O(1)。 程序的 time complexity 清楚地表明它不适用于较大的输入。因此,需要进行一些优化来降低 time complexity。 优化概念是枢轴化数组的每个元素,然后只取那些相等或差值为 1 的元素,使得子序列中的最大差值为 1。 观察以下步骤。 步骤 1: 定义一个变量 ans。将其初始化为 0。变量 "ans" 将包含最终答案。 步骤 2: 迭代 'j' 从 0 到 'len - 1'
步骤 3: 返回 'ans' 作为最终答案。 现在,让我们观察上述算法的实现。 文件名: LongestHarmonioussubsequence1.java 输出 For the input array: 11 12 12 13 14 15 11 11 11 11 The length of the longest Harmonic subsequence is: 7 For the input array: 0 1 5 8 10 19 15 25 30 40 45 7 11 The length of the longest Harmonic subsequence is: 2 复杂度分析: 在程序中,每个输入数组元素都会被枢轴化。此外,一个循环会遍历数组,需要 O(len) 的时间。因此,程序的整体时间复杂度为 O(len2),其中 'len' 是输入数组的大小。程序的空间复杂度是常数,即 O(1)。 另一种方法:使用 HashMap 该方法是在 HashMap 中存储一个元素出现的次数。在每次迭代中,检查两件事
步骤如下 步骤 1: 定义一个变量 ans。将其初始化为 0。变量 "ans" 将包含最终答案。 步骤 2: 定义一个 HashMap 'freqHashMap' 来存储输入数组 inputArr[] 中每个元素出现的次数。 步骤 3: 迭代 'j' 从 0 到 'len - 1'
步骤 4: 返回 'ans'。 以下程序实现了上述步骤。 文件名: LongestHarmonioussubsequence2.java 输出 For the input array: 11 12 12 13 14 15 11 11 11 11 The length of the longest Harmonic subsequence is: 7 For the input array: 0 1 5 8 10 19 15 25 30 40 45 7 11 The length of the longest Harmonic subsequence is: 2 复杂度分析: 在程序中,使用一个循环遍历输入数组,并将每个元素的计数增加到 HashMap 中,其摊销时间复杂度为 O(1)。因此,程序的整体时间复杂度为 O(N)。此外,HashMap 最多可以增长到输入数组的大小。因此,程序的整体空间复杂度也为 O(N)。其中 N 是输入数组中的总元素数量。 |
是一位在 Java 技术方面拥有全栈 Web 应用程序开发专业知识的软件工程师。他们既懂前端开发又懂后端开发,并负责设计、开发和维护满足客户需求的 Web 应用程序。的角色包括...
阅读 6 分钟
当链表中的一个节点指向前面的节点时,会形成一个循环,创建一个周期而不是结束列表。检测和移除此循环可以恢复列表的线性结构,避免无限遍历并提高其对后续操作的可靠性。方法:使用哈希此...
阅读9分钟
Java 提供了两个非常强大的库来处理 JSON 数据,即 JACKSON 和 Gson 库。我们经常需要将 JSON 响应转换为 map 以便轻松处理返回的 JSON 数据。我们可以轻松地将 JSON 数据转换为 map,因为 JSON 格式...
7 分钟阅读
Java 作为一种多功能编程语言,为开发人员提供了各种工具和结构来高效地管理和处理数据。用于处理数据的两个最广泛使用的机制是集合(Collections)和流(Streams)。它们各自服务于不同的目的,并具有各自的优点和...
阅读 4 分钟
?在 Java 编程的世界里,流已成为一种强大而通用的概念,用于以简洁高效的方式处理数据集合。流在 Java 8 中引入,它提供了一种函数式的方法来处理数据,使开发人员能够对...执行复杂的数据操作。
7 分钟阅读
在快速发展的商业环境中,Java 已成为使用最广泛的编程语言之一。其多功能性、平台独立性和丰富的库使其成为开发健壮且可扩展的企业应用程序的首选。然而,与任何技术一样,Java 并非没有...
阅读 4 分钟
旋转矩阵是计算机科学中的一个常见问题,尤其是在图形和图像处理领域。有不同的方法可以旋转矩阵,其时间和空间复杂度各不相同。在这里,我们将讨论如何将矩阵顺时针旋转 90 度...
7 分钟阅读
Java 是一种通用且广泛使用的编程语言,它提供了多种支持多态的特性。多态是面向对象设计中的一个关键概念,它允许我们轻松方便地编写与不同对象协同工作的代码。Java 中的名义多态性是一个重要的...
阅读 4 分钟
在本节中,我们将学习什么是 Tetranacci 数,并创建 Java 程序来检查给定的数是否为 Tetranacci 数。Tetranacci 数程序经常在 Java 编码面试和学术界出现。Tetranacci 数 Tetranacci 数类似于...
阅读 3 分钟
在 Java 中,`Deprecated` 注解可以定义为用于指示特定类、方法、接口或字段不应被使用的注解。已弃用的元素或实体被标记为指示它不再可用。什么是...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India