【问题标题】:Finding three numbers whose sum is divisible by a given number找到三个总和可以被给定数字整除的数字
【发布时间】:2017-11-17 00:53:51
【问题描述】:

如何在数组中搜索并找到三个值的每个组合,这些值的总和可以被 java 中的给定数字 (x) 整除。

换句话说,每个组合 (n1+n2+n3) % x == 0。

我知道这将是一个使用三重 for 循环的简单解决方案,但我需要时间复杂度为 O(N^2) 的东西。

有什么想法吗?

【问题讨论】:

    标签: java hashmap hashtable


    【解决方案1】:

    1 - 散列列表中的每个(元素 % x)。

    2 - 对列表中的每一对元素求和(我们称之为 sum y)并做 modded_y = y % x。

    3 - 检查 x - modded_y 是否在哈希表中。如果它是并且它不是其他 2 个数字之一,那么您找到了一个可能的组合。继续迭代和散列你找到的组合,这样它们就不会重复。

    这被称为中间战略。

    它的复杂度是 O(n + (n^2 * 1)) = O(n^2)

    【讨论】:

    • 第一个和第二个列表是什么?
    • 看起来这找到了一个组合,对吗?挑战在于找到所有组合。
    • 是的,你是对的......我很高兴回答并没有仔细阅读:/虽然答案可以很容易地扩展。将再次更新它,希望不会再搞砸了。
    【解决方案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]。

    这应该为您提供所有组合,而无需使用任何三重循环。

    【讨论】:

    • 我认为,如果您发布解决方案的完整代码而不是用文字描述它会更好。
    • 我不明白这个解决方案。仅当元素 1 和 2 的总和可整除且第三个元素也可整除时,三元组才有效?如果 x 是 5 并且列表是 [1, 2, 3] 呢?
    • @JoaquimFerrer,只有 2,3 对才能进入 A2,因为 (2+3)%5 = 0 但 1%5 != 0 无法进入 A3。因此,我的程序会拒绝三元组 [1,2,3] .....
    • @EduardMalakhov 这个问题听起来有点像家庭作业...根据:meta.stackoverflow.com/questions/334822/… --- “如果您认为它对学生没有帮助,通常最好不要提供完整的代码示例,用你最好的判断......“如果最初的提问者可以证实这不是家庭作业,我可能会提供程序。
    猜你喜欢
    • 2020-12-06
    • 2012-11-10
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多