如何在数组中找到乘以某个数字的两个值

Jos*_*usa -1 java arrays compare numbers multiplication

我想要做的是搜索一个数组并找出是否有两个数字可以乘以 225。这就是我现在所拥有的:

    int n = A.length;

    for(int i = 0; i >= n; i++){
        for(int j = 0; j >= n; j++){
            if(i == j){
            }
            else if(A[i] * A[j] == 225){
                return true;
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

发生的事情是它找到数组中的第一个值并将其与其他所有值相乘,一旦找到两个 225 的数字,则返回 true。我也这样做了,如果 i 和 j 是相同的数字,那么它什么都不做,因为我不希望它比较相同位置的值。问题是,即使在确实有两个乘以 225 的数字(如 15、45、60、15)的数组上,它也会不断返回 false。那么我的代码有什么问题。

Iły*_*sov 5

for 循环有 1 个问题:

它应该是这样的:

int n = A.length;
for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
        if(i != j)
            if(A[i] * A[j] == 225)
                return true;
Run Code Online (Sandbox Code Playgroud)

此外,您可以稍微优化此循环以:

int n = A.length;
for(int i = 0; i < (n-1); i++)
    for(int j = (i+1); j < n; j++)
        if (A[i] * A[j] == 225)
            return true;
Run Code Online (Sandbox Code Playgroud)

这是一个有点不同的版本,它的平均复杂度为 O(N):

    final Map<Integer, Boolean> set = new HashMap<>(A.length);
    for (final int i : A) {
        set.put(i, set.containsKey(i)); // store number from array, set to true if there are multiple occurrences of 2 numbers
    }
    for (final int i : A) {
        final int mult = 225 / i;
        if ((mult * i) == 225) { // test that integral multiplication leads to 225
            final Boolean m = set.get(mult);
            if (m != null) { // we have both numbers in set, now we should filter double counting
                if ((i != mult) || ((i == mult) && m.booleanValue()))
                    return true;
            }

        }
    }
    return false;
Run Code Online (Sandbox Code Playgroud)