algorithm - 数组中的最大绝对差

标签 algorithm

我遇到了这个算法问题。我能够实现 O(n^2) 解决方案。有没有更好的方法在 O(n) 时间内做到这一点?

问题:

给定一个由 N 个整数组成的数组,A1, A2,…, AN。返回所有 1 ≤ i, j ≤ Nf(i, j) 的最大值。 f(i, j) 定义为 |A[i] - A[j]| + |i - j|,其中 |x| 表示 x 的绝对值。

示例:

A=[1, 3, -1]

f(1, 1) = f(2, 2) = f(3, 3) = 0
f(1, 2) = f(2, 1) = |1 - 3| + |1 - 2| = 3
f(1, 3) = f(3, 1) = |1 - (-1)| + |1 - 3| = 4
f(2, 3) = f(3, 2) = |3 - (-1)| + |2 - 3| = 5

因此,我们返回 5。

我的答案:

public class Solution {
    public int maxArr(ArrayList<Integer> A) {
        int maxSum = 0;

        for(int i=1; i<=A.size()-1; i++){
            for(int j=i+1; j<=A.size(); j++){
                int tempSum = sum(A.get(i-1), A.get(j-1), i, j);

                if(tempSum > maxSum) {
                    maxSum = tempSum;
                }
            }
        }

        return maxSum;
    }

    public int sum(int Ai, int Aj, int i, int j) {
        return Math.abs(Ai-Aj) + Math.abs(i-j);
    }
}

此外,在我的解决方案中,内部循环从 i + 1 运行到 N,因此最坏的情况是该循环的 N-1。我的整体解决方案仍然是 O(n^2) 吗?

最佳答案

是的,你的解决方案仍然是 O(N^2)(N - 1) + (N - 2) + ... + 1 = N * (N - 1) / 2 .

我将展示如何在线性时间内解决更一般的问题:给出 2D 空间中的点列表 (x[i], y[i]),找到两个最远的点(相对于曼哈顿距离)。

  1. 让我们找到以下点:max(x[i] + y[i]), max(-x[i] + y[i]), max(-y[i] + x[i] ]) 和 max(-x[i] - y[i]) 在所有 i 中。

  2. 让我们计算列表中的每个点与上一步中选择的四个点之间的距离,并选择最大的一个。该算法显然在线性时间内工作,因为它考虑 4 * N点对。我声称这是正确的。

  3. 为什么?让我们固定一个点 (x[k], y[k]) 并尝试找到离它最远的点。考虑任意点 (x[i], y[i])。让我们扩大它们的坐标之间的差异的绝对值。我们假设它是 x[i] + x[k] + y[i] + y[k] = (x[k] + y[k]) + x[i] + y[i] 。第一项是常数。如果x[i] + y[i]不是所有 i 中最大的, (x[i], y[i])不可能是最远的。其他三种情况(取决于展开式中 x[i] 和 y[i] 的符号)以相同的方式处理。

关于algorithm - 数组中的最大绝对差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60797902/

相关文章:

c++ - 从不平衡的二叉搜索树中删除一个元素

c++ - 使用模拟测试迭代代码 - 它有意义吗?

algorithm - 到达比赛结束的最少步骤

java - 如何分析下面代码的增长?

javascript - 使用测距选项生成零件号的最佳方法

算法帮助,数学很烂

c++ - 寻找最小的窗口

python - 为什么使用参数会使这个函数慢得多?

c - C中的图算法通过将网格读入数组

algorithm - 如果在 IF 语句中有 return 或 throw 语句,可以不使用 ELSE 语句吗?