【发布时间】:2017-11-17 00:53:51
【问题描述】:
如何在数组中搜索并找到三个值的每个组合,这些值的总和可以被 java 中的给定数字 (x) 整除。
换句话说,每个组合 (n1+n2+n3) % x == 0。
我知道这将是一个使用三重 for 循环的简单解决方案,但我需要时间复杂度为 O(N^2) 的东西。
有什么想法吗?
【问题讨论】:
如何在数组中搜索并找到三个值的每个组合,这些值的总和可以被 java 中的给定数字 (x) 整除。
换句话说,每个组合 (n1+n2+n3) % x == 0。
我知道这将是一个使用三重 for 循环的简单解决方案,但我需要时间复杂度为 O(N^2) 的东西。
有什么想法吗?
【问题讨论】:
1 - 散列列表中的每个(元素 % x)。
2 - 对列表中的每一对元素求和(我们称之为 sum y)并做 modded_y = y % x。
3 - 检查 x - modded_y 是否在哈希表中。如果它是并且它不是其他 2 个数字之一,那么您找到了一个可能的组合。继续迭代和散列你找到的组合,这样它们就不会重复。
这被称为中间战略。
它的复杂度是 O(n + (n^2 * 1)) = O(n^2)
【讨论】:
我将调用给定的数组 A1。
1) 创建两个结构体
struct pair{
int first;
int second;
bool valid;
}
struct third{
int value;
int index;
}
2) 使用嵌套循环,初始化所有可能对的数组 B1。
3) 循环通过 B1。 if (A1[B1[i].first] + A1[B1[i].second])%x==0 然后将 B1[i].valid 设置为 true
4) 创建一个由Thirds 组成的数组A3,它存储A1 中可被x 整除的每个元素的索引和值。
5) 使用嵌套循环,遍历 A3 的每个元素和 B1 的每个元素。如果 B1.valid = true 使用 A1[A3.index] 中的元素打印 A1[B1[i].first] 和 A1[B1[i].second]。
这应该为您提供所有组合,而无需使用任何三重循环。
【讨论】: