Java 中所有元素均为偶数或奇数的最大子数组2024年9月10日 | 阅读10分钟 给定一个包含非负数的数组 inputArr[]。我们的任务是找到一个最长子数组,该子数组中的所有元素要么都是偶数,要么都是奇数。 示例:1 输入 int arr[] = {5, 5, 3, 7, 9, 7, 0, 1, 2, 7} 输出 6 解释:子数组 {5, 5, 3, 7, 9, 7} 是包含所有奇数元素的最长子数组,其长度为 6。 示例:2 输入 int arr[] = {9, 2, 0, 4, 8, 6, 2, 0, 0, 1, 5, 4, 4, 1, 7} 输出 8 解释:子数组 {2, 0, 4, 8, 6, 2, 0, 0} 是包含所有偶数元素的最长子数组,其长度为 8。 朴素方法基本方法的朴素做法是计算所有子数组,然后检查这些子数组的元素是偶数还是奇数。包含所有奇数或偶数元素且在具有给定条件的子数组中最大的那个就是我们的答案。 步骤 1:创建一个名为 findCountLongestSubArr() 的方法,该方法接受输入数组。 步骤 2:在方法内部,创建嵌套的 for 循环。这些嵌套的 for 循环将计算所有子数组。 步骤 3:使用一个名为 isOdd 的标志,筛选出子数组的奇数或偶数元素,但不能同时筛选。子数组的第一个元素决定了子数组的后续元素是偶数还是奇数。 步骤 4:创建两个变量 countEle 和 ans。变量 countEle 计算子数组中符合条件的元素的数量,而 ans 存储问题的最终答案。 步骤 5:在内层 for 循环中,检查当前元素是否为奇数,以及子数组的第一个元素。如果第一个元素和当前元素都是奇数或都是偶数,则将变量 countEle 增加 1;否则,使用 break 语句终止内层循环。 步骤 6:内层循环终止后,比较 ans 和 countEle 的值。将这两个值中较大的一个存储在变量 ans 中。 步骤 7:最后,返回变量 ans。 实施请看基于以上步骤的实现。 文件名:LongestSubArr.java 输出 For the input array: 5 5 3 7 9 7 0 1 2 7 The length of the largest odd or even subarray is: 6 For the input array: 9 2 0 4 8 6 2 0 0 1 5 4 4 1 7 The length of the largest odd or even subarray is: 8 复杂度分析:由于嵌套的 for 循环,程序的 time complexity 为 O(n2),其中 n 是输入数组中元素的总数。该程序不使用任何数据结构。因此,程序的 space complexity 为常数,即 O(1)。 借助动态规划,我们可以将程序的 time complexity 从 O(n2) 降低。以下方法展示了这一点。 方法:使用动态规划步骤 1:创建一个数组 dpArr[],其中 dpArr[p] 表示以索引 p 结尾的子数组的长度。 步骤 2:将 dpArr[0] 赋值为 1。 步骤 3:初始化变量 temp 为 1,用于存储答案。 步骤 4:使用循环遍历输入数组的元素,并在每次迭代中执行以下操作。请注意,迭代应从 (1 到 N) 开始。
步骤 5:遍历 dpArr[] 并找到最大值。 步骤 6:将(在上一步中找到的)最大值赋给变量 temp。 步骤 7:返回 temp。 请看使用上述步骤实现的实现。 文件名:LongestSubArr1.java 输出 For the input array: 5 5 3 7 9 7 0 1 2 7 The length of the largest odd or even subarray is: 6 For the input array: 9 2 0 4 8 6 2 0 0 1 5 4 4 1 7 The length of the largest odd or even subarray is: 8 复杂度分析:程序使用了两个 for 循环。但是它们不是嵌套的。因此,程序的 time complexity 为 O(n)。此外,该程序使用了辅助数组(在本例中为 dpArr[]),使程序的 space complexity 为 O(n),其中 n 是输入数组中元素的总数。 我们在 time complexity 方面进行了优化。但是,这牺牲了辅助数组,使 space complexity 变为 O(n)。现在,我们将进行优化以降低 space complexity。 我们发现 dpArr[p] 仅依赖于 dpArr[p - 1](参见上面编写的程序)。因此,我们可以说 dpArr[] 的当前元素仅依赖于 dpArr[] 的最后一个元素,因此我们不需要辅助数组。我们只需要一个变量来完成我们的工作。下面对此进行了说明。 文件名:LongestSubArr2.java 输出 For the input array: 5 5 3 7 9 7 0 1 2 7 The length of the largest odd or even subarray is: 6 For the input array: 9 2 0 4 8 6 2 0 0 1 5 4 4 1 7 The length of the largest odd or even subarray is: 8 复杂度分析:程序的 time complexity 与上一个程序相同。该程序不使用任何数据结构,使程序的 space complexity 为常数,即 O(1)。 下一个主题Java 中的开放和封闭哈希 |
丑数是 Java 中另一种特殊的正数。如果一个数字只有 2、3 或 5 个素数因子,并且按照惯例 1 也被包含在内,则该数字称为丑数。让我们以丑数为例。27 不是丑数,因为...
阅读 8 分钟
在 Java 中,使用 PushbackReader 类的 read() 方法从流中读取单个字符。能够“撤销”一个字符并在稍后重新处理它,使其能够用于顺序字符读取。此功能在...中非常有用
阅读 4 分钟
在 Java 中,Guava 的 Sets.intersection() 方法返回一个不可修改的视图,表示提供的两个集合的交集。所有存在于两个集合中的元素或值都将被返回。返回集合和第一个集合的迭代顺序将相似。语法:public...
阅读 2 分钟
在 Java 中,每当我们尝试访问数组中不存在索引的任何项时,就会发生这种情况。换句话说,索引可能是负数或超过数组的大小。这是一个子类...
阅读 2 分钟
java.time.chrono.JapaneseChronology 类有一个 eras() 方法。要获取此特定日本历法下的所有 era,请使用 JapaneseChronology 代码。语法:public List eras() 参数:此方法不能接受任何参数。返回值:此历法下的所有 era...
阅读 3 分钟
在任何编程语言中,程序都需要标识符来存储可在整个程序中使用的不同值。这些标识符就是变量。Java 中的变量是分配给存储在系统内存中的值的名称。该值可以在...
阅读 4 分钟
提供的字符串的任务是在 Java 中将一个新字符串插入到给定字符串的特定索引处。示例 1:输入:StringOriginal = "Hello World",InsertedString = "Welcome To ",Atindex = 5 输出:插入另一个字符串后的字符串是 "Hello, Welcome To World." 示例 2:输入:StringOriginal...
5 分钟阅读
调和数是一个迷人的数学概念,在物理、工程和计算机科学等各个领域都有应用。在本节中,我们将探讨调和数是什么,它们的意义以及如何在 Java 中计算它们。我们还将提供带有输出的示例 Java 程序……
阅读 4 分钟
在本节中,我们将通过适当的示例讨论什么是 zigzag 数组(锯齿形数组)。我们还将创建一个 Java 程序来将普通数组转换为 zigzag 数组,反之亦然。什么是 zigzag 数组?一个数组称为……
阅读 6 分钟
Java 中的最小回文问题,给定一个表示整数的字符串 n,我们的任务是找到回文数并返回最接近的整数(不包括它本身)。如果存在平局,则返回较小的那个。绝对差值...
阅读9分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India