Java 中最小差值子数组2024年9月10日 | 阅读 9 分钟 我们给定一个输入数组 inputArr[],其中包含 n 个数字。我们的任务是找到两个子数组之间的最小差值。子数组是从给定的输入数组中创建的。如果一个元素属于一个子数组,那么它就不能属于另一个子数组。此外,任何一个子数组都不能是空的。以下示例说明了这一点。 示例 1 输入 int arr[] = {7, 6, 8, 1, 5} 输出 1 解释: 如果我们创建两个子数组:subArr1 = {6, 8} 和 subArr2 = {7, 1, 5},那么我们得到的子数组元素之和为:6 + 8 = 14,而 7 + 1 + 5 = 13,它们的差值为 14 - 13 = 1。因此,输出为 1。 示例 2 输入 int arr[] = {2, 4, 8, 9, 5, 7, 3, 6, 1} 输出 1 解释: 如果我们创建两个子数组:subArr1 = {8, 9, 5} 和 subArr2 = {2, 4, 7, 3, 6, 1},那么我们得到的子数组元素之和为:8 + 9 + 5 = 22,而 2 + 4 + 7 + 3 + 6 + 1 = 23,它们的差值为 23 - 22 = 1。因此,输出为 1。 示例 3 输入 int arr[] = {3, 3, 3, 3, 3} 输出 3 解释: 如果我们创建两个子数组:subArr1 = {3, 3, 3} 和 subArr2 = {3, 3},那么我们得到的子数组元素之和为:3 + 3 + 3 = 9,而 3 + 3 = 6,它们的差值为 9 - 6 = 3。因此,输出为 3。 方法:暴力法我们将找到第一个子数组的所有可能值,对于每个可能的值,我们将找到第二个子数组的值。然后,我们将计算第一个子数组的值和第二个子数组的值之间的绝对差值,绝对最小值差就是我们的答案。下面的程序对此进行了说明。 文件名: MinDiffSubArrays.java 输出 For the input array: 7 6 8 1 5 The minimum difference between the two subarrays is: 1 For the input array: 2 4 8 9 5 7 3 6 1 The minimum difference between the two subarrays is: 1 For the input array: 3 3 3 3 3 The minimum difference between the two subarrays is: 3 复杂度分析: 每次递归调用都会产生两个指数级调用。因此,程序的 time complexity 是指数级的。 程序的 time complexity 太高,不适合较大的输入。因此,我们必须进行一些优化,这在以下方法中有所说明。 方法:使用前缀和 (PrefixSum)借助一个辅助数组 (prefixArr[]),我们将存储输入数组 (inputArr[]) 的前缀和,其中 prefixArr[j] 表示从 0 到 j 的元素之和。 算法步骤 1: 声明 prefixArr 数组以存储输入数组的前缀和。 步骤 2: 将输入数组的所有元素复制到 prefixArr 中。 步骤 3: 对于从 1 到 s - 1 的每个索引 j(s 是输入数组的大小),执行以下操作:
步骤 4: 声明一个变量来存储最小差值,在本例中为 minDifference。 步骤 5: 声明一个变量来存储第一个子数组的元素之和,在本例中为 firstSubArrSum。 步骤 6: 声明一个变量来存储第二个子数组的元素之和,在本例中为 secondSubArrSum。 步骤 7: 将最大整数值赋给 minDifference 变量。 步骤 8: 对于索引 j 在 0 到 s - 2 的范围内,执行以下操作:
步骤 9: 返回 minDifference 的值。 实施观察上述算法的实现。 文件名: MinDiffSubArrays.java 输出 For the input array: 7 6 8 1 5 The minimum difference between the two subarrays is: 1 For the input array: 2 4 8 9 5 7 3 6 1 The minimum difference between the two subarrays is: 1 For the input array: 3 3 3 3 3 The minimum difference between the two subarrays is: 3 复杂度分析: findMinDiff() 方法使用了三个 for 循环。但是,它们之间没有嵌套。因此,time complexity 为 O(n)。此外,程序中还使用了辅助数组 (prefixArr[]),因此 space complexity 为 O(n),其中 n 是输入数组中元素的总数。 我们将对 space complexity 进行优化。请参阅下面的方法。 方法:使用恒定空间 (Constant Space)在此方法中,我们将使用变量而不是辅助数组。我们将使用一个变量 totalEleSum 来存储输入数组的所有元素之和。另一个变量 firstSubArrSum 也用于存储第一个子数组的元素之和。第二个子数组的元素之和可以通过 totalEleSum - firstSubArrSum 轻松计算得出。现在,进行比较以计算每个索引的绝对最小差值。请参阅以下程序。 文件名: MinDiffSubArrays.java 输出 For the input array: 7 6 8 1 5 The minimum difference between the two subarrays is: 1 For the input array: 2 4 8 9 5 7 3 6 1 The minimum difference between the two subarrays is: 1 For the input array: 3 3 3 3 3 The minimum difference between the two subarrays is: 3 复杂度分析: 该程序的 time complexity 与前一个程序相同。该程序的 space complexity 是恒定的,即 O(1),因为程序没有使用辅助数组。 下一主题Java 中“加一”数组问题 |
在编程方面,精确度至关重要。尤其是在涉及计算和运算的应用程序中,结果的准确性至关重要。这就是浮点数的作用所在。在 Java 编程世界中,理解和有效利用 float 数据类型对于...
阅读 4 分钟
在本节中,我们将学习如何创建一个 Java 程序来查找三个数字中的最小者。除此之外,我们还将学习如何使用三元运算符在 Java 中查找三个数字中的最小者。使用三元运算符 在进入程序之前……
阅读 3 分钟
Java 提供了多种遍历集合(如数组、列表、集合和映射)的方法。最常用的两种方法是 Iterator 和 foreach。理解这两种方法之间的区别对于编写高效且易于阅读的 Java 代码至关重要。Iterator Iterator 接口在...
阅读 4 分钟
查找岛屿数量问题是通常在顶级公司编码轮面试中提出的标准问题。该问题基于图论。在图论中,我们查找连通分量的数量。在此问题中,我们必须查找相同的数量。因此,在...
阅读 6 分钟
Java 框架是 Java 开发人员用于开发 Java 应用程序或 Web 应用程序的预写代码的身体或平台。换句话说,Java 框架是一组预定义的类和函数,用于处理输入、管理硬件设备并与系统交互……
阅读 4 分钟
在 Java 中使用递归反转双向链表需要理解双向链表的结构和递归过程。双向链表的节点由三个部分组成:数据字段、指向节点的指针……
5 分钟阅读
JFileChooser 是 java Swing 包中的一个类。java Swing 包对于 JavaTM Foundation Classes (JFC) 至关重要。JFileChooser 包含许多有助于在 Java 中构建图形用户界面的元素。Java Swing 提供按钮、面板、对话框等组件。JFileChooser...
5 分钟阅读
图像处理是计算机视觉的一个重要方面,它使计算机能够像人脑一样识别和处理图像。Java 提供了一个强大的环境,可以在其中使用健壮的库实现图像处理算法,并且不受平台依赖性的影响。边缘检测...
7 分钟阅读
? 用户输入是任何应用程序的基本方面。它允许程序与用户交互,使其具有动态性和响应性。在 Java 中,有几种获取用户输入的方法,最常见的方法涉及 Scanner 类、BufferedReader 类和 Console...
5 分钟阅读
Java 和 Bastar,虽然在它们的性质和目的上相去甚远,但它们本身都是引人入胜的实体。一个是广泛使用的编程语言,而另一个是指印度一个文化底蕴丰富的地区。在本节中,我们将讨论...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India