Swapping Pair Make Sum Equal Problem in Java2025年5月6日 | 阅读 9 分钟 这是 Google、Amazon、TCS、Accenture、Flipkart 等顶级 IT 公司面试中经常遇到的一个问题。通过解决这个问题,可以考察面试者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,我们将探讨**交换对使和相等问题**的各种方法和逻辑。我们还将创建相应的 Java 程序。 问题陈述**交换对使和相等问题**涉及从两个 数组中各找一个元素,交换它们后使两个数组的总和相等。这需要确定目标差值,并使用哈希或基于排序的技术来高效地搜索有效对。 示例输入 数组 1: [5, 7, 4, 6] 数组 2: [1, 2, 3, 8] 输出 交换对: (5, 1) 解释 将数组 1 中的 5 与数组 2 中的 1 交换后,新的总和变得相等。最初,数组 1 的总和为 22,数组 2 的总和为 14,差值为 8。交换后,数组 1 的总和减少 4,数组 2 的总和增加 4,两者的总和都平衡在 18。 方法 1: 使用 HashSet算法步骤 1: 计算总和: 分别计算数组 1 (sum1) 和数组 2 (sum2) 中元素的总和。这有助于我们了解两个数组当前的总和差值。 步骤 1.1: 检查是否提前终止: 在继续之前,重要的是检查总和差值是否为偶数。如果 sum1 - sum2 是奇数,则意味着不存在有效的对,因为从一个数组中交换元素与另一个数组中的元素不会平衡总和。此检查允许提前终止,避免不必要的计算。如果差值为奇数,则返回 null,因为不存在有效的解决方案。 步骤 2: 确定差值: 计算两个数组的总和之差
如果此差值为奇数,则无法平均分配,因为整数交换无法实现分数变化。在这种情况下返回 null。 否则,计算交换对的目标差值
目标值告诉我们两个交换的元素之间的差值应该为多少。 步骤 3: 为数组 2 准备快速查找: 为了快速查找潜在对的存在,将数组 2 的所有元素存储在 HashSet 中。这允许在搜索有效对时进行常数时间查找。 步骤 3.1: 处理空数组: 准备好数组 2 的 HashSet 后,必须检查数组 1 或数组 2 是否为空。如果其中一个数组为空,则无法进行交换,我们应立即返回 null。此步骤确保我们避免不必要的处理并高效地处理边缘情况。 步骤 4: 搜索交换对: 遍历数组 1 中的每个元素 a。对于每个元素 a,计算数组 2 中需要的值 b,以平衡总和
检查 b 是否存在于 HashSet 中。如果存在,则 a 和 b 构成一个可以交换的有效对。 步骤 5: 返回结果: 如果找到有效的对 (a, b),则将其作为结果返回。如果在检查完数组 1 中的所有元素后未找到这样的对,则返回 null。 步骤 6: 如果未找到对,则返回 null: 如果在检查完数组 1 的所有元素后仍未找到有效的对,则返回 null,表示无法通过交换两个数组中的元素来使总和相等。此步骤确保算法能够处理不存在解决方案的情况并提供明确的结果。 文件名: SwapPairEqualSum.java 输出 Swap pair: (5, 1) 复杂度分析时间复杂度该算法的时间复杂度为 O(m + n),其中 m 和 n 分别是两个数组的大小。计算总和需要 O(m + n),构建 HashSet 需要 O(n),查找对需要 O(m)。它通过避免嵌套迭代来确保高效的性能。 空间复杂度程序的空间复杂度为 O(n),其中 n 是第二个数组的大小。这是因为将数组 2 的元素存储在 HashSet 中以进行高效查找。除了 HashSet 之外,该算法使用了恒定的额外空间,因此总体上是空间高效的。 方法 2: 使用双指针技术算法步骤 1: 计算两个数组的总和: 首先,计算两个数组中元素的总和。我们将第一个数组的总和称为 sum1,第二个数组的总和称为 sum2。这些总和之间的差值 (diff = sum1 - sum2) 告诉我们数组的失衡程度。如果此差值为奇数,则不可能平均分配差值,因此我们返回 null。如果差值为偶数,我们计算目标 = diff / 2,这将指导所需的交换。 步骤 2: 对两个数组进行排序: 对数组进行排序可以更轻松地应用双指针技术。通过将 array1 按升序排序,将 array2 按降序排序,我们可以快速找到正确的对。 步骤 2.1: 处理边缘情况: 在步骤 2 对两个数组进行排序后,在继续双指针搜索之前,处理边缘情况很重要。具体来说,您需要处理一个或两个数组可能为空,或者数组大小太小而无法形成有效对的情况。 步骤 3: 双指针搜索: 初始化两个指针:一个指针 (i) 指向 array1 的开头,另一个指针 (j) 指向 array2 的末尾。目的是找到两个元素,一个来自 array1 (a),一个来自 array2 (b),使得它们之间的差值 (a - b) 等于目标。 如果 a - b 等于目标,则返回此对作为解决方案。 如果 a - b 大于目标,则表示我们需要 array1 中的一个较小值,因此我们增加指针 i 以移动到较大的元素。 如果 a - b 小于目标,则表示我们需要 array2 中的一个较大值,因此我们减小指针 j 以移动到较小的元素。 步骤 4: 返回结果: 如果两个指针在未找到有效对的情况下交叉,则返回 null。否则,找到的对就是解决方案。 步骤 5: 验证交换: 找到一对元素后,验证交换它们是否会平衡两个数组的总和很重要。 重新计算总和: 执行交换后,再次计算两个数组的总和。如果总和现在相等,则交换有效并解决了问题。 检查意外更改: 确保交换没有导致数组发生任何意外更改,例如破坏顺序或意外修改其他元素。 文件名: SwapPairEqualSum.java 输出 Checking: (4, 8) with difference: -4 Checking: (4, 3) with difference: 1 Checking: (4, 2) with difference: 2 Checking: (4, 1) with difference: 3 No valid swap pair found. 复杂度分析时间复杂度此方法的时间复杂度为 O (n log n + m log m),其中 n 和 m 分别是 array1 和 array2 的大小。对两个数组进行排序需要 O (n log n) 和 O (m log m)。双指针搜索以 O(n + m) 的时间复杂度遍历数组,使该方法整体上高效。 空间复杂度假设排序是就地执行的,则程序的空间复杂度为 O (1)。该算法除了输入数组外,不使用任何额外的 数据结构,只使用几个整数 变量和指针进行计算。因此,它以恒定的额外空间运行,使其在内存使用方面高效。 性质偶数总和差: 此问题的一个基本属性是,两个数组的总和之差必须为偶数,才能存在有效的交换。如果差值为奇数,则无法进行有效的交换,可以提前终止解决方案。 目标差值: 一旦确认总和差值为偶数,将其除以二即可计算目标差值。此目标表示为了使总和相等,两个交换的元素需要具有的差值。 对的存在: 问题的核心在于找到两个元素,一个来自每个数组,使得它们的差值与目标匹配。这可以通过基于哈希的查找或双指针技术来实现,具体取决于所采用的方法。 搜索效率: 通过利用 HashSet(用于常数时间查找)或排序后跟双指针搜索,可以高效地解决该问题。虽然基于哈希的方法可确保线性时间复杂度,但双指针方法会引入排序,从而增加了时间复杂度中的对数分量。 可伸缩性: 该解决方案高效且可伸缩,适用于各种大小的数组。两种方法都可以处理较大的输入,尽管空间复杂度有所不同。哈希需要额外的内存来存储其中一个数组的元素,而双指针方法除了输入数组外,使用恒定的空间。 优点
缺点
下一主题旅行商问题 |
Web 浏览器利用一种称为 CORS(跨域资源共享)的安全功能,阻止网站向非原始域发出请求。通过限制 Web 应用程序只能与来自其原始域的资源进行交互,除非获得明确许可...
阅读 2 分钟
? 在 Java 中,我们使用数组来存储相同数据类型的元素。有时需要声明一个空数组,或者在不使用任何值对其进行初始化的情况下生成一个数组。在本节中,我们将学习如何声明一个空数组...
5 分钟阅读
关于 Java 的并发编程,有两种同时执行多个任务的选项:进程和线程。虽然它们都提供可比的优势,但它们之间存在一些显著的区别。以下是 Java 进程和线程的比较表:进程是运行在其自身内存中的一个独立程序。线程是进程内的一个执行路径...
阅读 4 分钟
Java DecimalFormat 类的 getPositiveSuffix() 方法用于检索此 DecimalFormat 实例的正后缀值。语法:public String getPositiveSuffix() 参数:此方法不接受任何参数。返回值:此方法返回 DecimalFormat 实例的正后缀值。示例 1:Java 中的 DecimalFormat 类用于此...
阅读 2 分钟
生日悖论(或困境)是概率论中的一个概念。尽管这并不构成逻辑矛盾意义上的悖论,但它之所以被称为悖论,是因为数学现实与常识相悖:大多数人认为……
5 分钟阅读
Java 中的最小成本路径问题是面试中最突出的问题之一。在此问题中,提供了一个矩阵(costMatrix[][]),它表示 costMatrix[][] 中每个单元格的成本。任务是转...
11 分钟阅读
Java 中找不到或无法加载主类错误 在 Java 编程语言中,经常会遇到错误和异常。但是,一些最流行和最常见的错误经常被初学者程序员遇到。在这些错误中,找不到...
5 分钟阅读
在 Java 中,字符串字面量是用双引号("")括起来的一系列字符。它是直接在代码中表示 String 对象的一种方式。字符串池是保留 String 字面量的位置。字符串字面量不能被更改。示例 String greeting...
阅读 3 分钟
Java 是一种通用且广泛使用的编程语言,其成功很大程度上归功于其强大的面向对象(OOP)架构。Java OOP 应用程序的核心是其对象模型,这是一个定义数据如何组织、组织和操作的关键概念……
阅读 10 分钟
给定一个整数数组 (arr) 和一个整数目标,我们需要找到通过对 arr 的非空子数组执行按位 AND 运算可以得到的、最接近目标的数字。任务是返回两个...
阅读 8 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India