数组对和可整除性问题17 Mar 2025 | 6 分钟阅读 数组对和可除性问题是一个计算挑战,它涉及在数组中识别其和可被指定除数整除的元素对。给定一个整数数组和一个除数 'k',目标是找出所有元素对 (arr[i], arr[j]),使得 (arr[i] + arr[j]) 可以被 'k' 整除。 在此问题的上下文中,如果 (arr[i] + arr[j]) % k == 0,则认为该对 (arr[i], arr[j]) 是合适的。 例如,考虑数组 arr = [8, 4, 7, 6, 2] 和除数 k = 4。任务是识别数组中元素对,使得它们的和可以被 4 整除。 示例 - 对 (8, 4): 8 + 4 = 12,12 可以被 4 整除。
- 对 (7, 1): 7 + 1 = 8,8 可以被 4 整除。
- 对 (6, 2): 6 + 2 = 8,8 可以被 4 整除。
因此,此示例的有效对是 (8, 4)、(7, 1) 和 (6, 2)。 算法输入 - 一个整数数组 arr。
- 数组的大小 n。
- 一个除数 'k'。
输出 其和可被 'k' 整除的对的列表或计数。 步骤: 1. 初始化数据结构 - 创建一个大小为 k 的 remainderHash 数组来存储余数的计数。
- 将数组元素初始化为零。
2. 遍历数组 对于数组中的每个元素 arr[i] - 计算 arr[i] 除以 k 后的余数。我们称之为余数。
- 计算可除性所需的补数:complement = (k - remainder) % k。
3. 在哈希表中检查补数 - 检查 remainderHash[complement] 是否大于零
- 如果为 true,则将对 (arr[i], complement) 作为结果的一部分打印。
4. 更新哈希表 - 增加 remainderHash[remainder] 的计数以考虑当前余数。
5. 输出结果 6. 清理 伪代码 方法 1:蛮力法最简单的方法是使用暴力法检查数组中所有可能的配对。计算每对的和,并查看它是否可以被给定除数整除。尽管此方法简单,但其时间复杂度为 O(n^2),这使得它对于大型数据集效率低下。 实施 输出  说明 - bruteForcePairSumDivisibility 函数将数组 arr、其大小 n 和除数 k 作为参数。
- 在实现中,两个嵌套循环遍历数组中的所有元素对。一个外循环(由 i 控制)从第一个元素到倒数第二个元素,一个内循环(由 j 控制)从下一个元素到最后一个元素。
- 对于每两个元素,计算它们的和 (pairSum = arr[i] + arr[j])。
- 然后检查和是否可以被给定除数整除 (if (pairSum % k == 0))。将这两个元素的平均值作为结果的一部分打印。
- 主函数演示了 bruteForcePairSumDivisibility 函数在示例数组 [8, 4, 7, 6, 2] 和除数 4 的使用。
方法 2:哈希使用哈希表可以大大提高效率。遍历数组,为每个元素计算补数(除数 - 元素)。检查此补数是否存在于哈希数据库中。如果肯定,则已发现一对。此方法的时间复杂度为 O(n),因此比暴力法更具可伸缩性。 实施 输出  说明 - hashingPairSumDivisibility 函数将数组 arr、其大小 n 和除数 k 作为参数。
- 在函数内部,创建一个动态分配的数组 remainderHash 作为哈希表。此数组初始化为存储元素除以 k 后的余数计数。
- 然后函数遍历数组。对于每个元素,它计算除以 k 后的余数。
- 它还计算可除性所需的补数 (complement = (k - remainder) % k)。
- 它检查补数是否存在于哈希表中 (if (remainderHash[complement] > 0))。如果存在,则将该对作为结果的一部分打印。
- 哈希表用当前余数计数进行更新。
- 最后,释放哈希表的动态分配内存。
方法 3:计数余数此方法用于计算每个元素除以除数时余数的出现次数。通过跟踪每个余数的计数,我们可以更有效地识别对并确定它们的总和是否可被提供的除数整除。当除数很小时,此方法非常有效。 实施 输出  说明 - countingRemaindersPairSumDivisibility 函数将数组 arr、其大小 n 和除数 k 作为参数。
- 它初始化一个数组 remainderCount 来存储余数的计数,并将每个元素初始化为零。
- 它遍历数组,计算每个元素的余数,并更新 remainderCount 数组中的计数。
- 然后函数根据余数的计数计算其和可被 k 整除的对的计数。
- 主函数演示了在示例数组 [8, 4, 7, 6, 2] 和除数 4 的使用。
方法 4:排序将数组从高到低排序。然后,采用双指针方法,一个从开头开始,另一个从结尾开始。根据当前对相对于除数的总和调整指针。由于排序阶段,此方法的时间复杂度为 O(n log n)。 实施 输出  说明 - 比较函数用于升序排序。
- sortingPairSumDivisibility 函数使用 qsort 排序数组,然后使用两个指针(left 和 right)查找其和可被 k 整除的对。
- 主函数演示了在示例数组 [8, 4, 7, 6, 2] 和除数 4 的使用。
|