找出三个数字之和可被给定数字整除
Finding three numbers whose sum is divisible by a given number
如何搜索数组并找到三个值的每个组合,其总和可被 java 中的给定数字 (x) 整除。
换句话说,每个组合 (n1+n2+n3) % x == 0。
我知道这将是一个使用三重 for 循环的简单解决方案,但我需要时间复杂度为 O(N^2) 的东西。
有什么想法吗?
1 - 散列列表中的每个(元素 % x)。
2 - 对列表中的每对元素求和(我们称求和为 y)并执行 modded_y = y % x.
3 - 检查 x - modded_y 是否在散列 table 中。如果是并且不是其他 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 = 真
使用 A1[A3.index] 中的元素打印 A1[B1[i].first] 和 A1[B1[i].second]。
这应该可以在不使用任何三重循环的情况下为您提供所有组合。
如何搜索数组并找到三个值的每个组合,其总和可被 java 中的给定数字 (x) 整除。
换句话说,每个组合 (n1+n2+n3) % x == 0。
我知道这将是一个使用三重 for 循环的简单解决方案,但我需要时间复杂度为 O(N^2) 的东西。
有什么想法吗?
1 - 散列列表中的每个(元素 % x)。
2 - 对列表中的每对元素求和(我们称求和为 y)并执行 modded_y = y % x.
3 - 检查 x - modded_y 是否在散列 table 中。如果是并且不是其他 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 = 真 使用 A1[A3.index] 中的元素打印 A1[B1[i].first] 和 A1[B1[i].second]。
这应该可以在不使用任何三重循环的情况下为您提供所有组合。