当前位置: 首页 > 面试题库 >

数组中的最大绝对差

汤博
2023-03-14
问题内容

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

题:

您将得到N个整数数组A1, A2 ,…, AN。返回的最大值f(i, j)为所有1 ≤ i, j ≤ Nf(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]的符号)以相同的方式处理。



 类似资料:
  • 问题内容: 上下文:我正在构建一个读取rss feed并在后台更新/检查feed的小站点。我有一个数组来存储要显示的数据,另一个数组来存储已显示的记录的ID。 问题:在事情变慢或变慢之前,数组可以在Javascript中容纳多少个项目。我没有对数组进行排序,但是正在使用jQuery的inArray函数进行比较。 该网站将保持运行状态,并进行更新,并且不太可能经常重启/刷新浏览器。 如果我想从数组中

  • 给出了一个由N个整数组成的数组。 数组的最大和是该数组的非空连续子数组的元素的最大和。 例如,数组[1,-2,3,-2,5]的最大和是6,因为子数组[3,-2,5]的和是6,并且不可能实现更大的子数组和。 现在,您只能从给定数组中删除一个以上的元素。这样做可以得到的结果数组的最大可能最大和是多少? 我正在用我自己的测试用例测试我的代码。我在Dev-C++上得到了正确的输出。但是当我在网上测试我的代

  • 问题 你需要找出数组中包含的最大的值。 解决方案 你可以使用 JavaScript 实现,在列表推导基础上使用 Math.max(): Math.max [12, 32, 11, 67, 1, 3]... # => 67 另一种方法,在 ECMAScript 5 中,可以使用 Array 的 reduce 方法,它与旧的 JavaScript 实现兼容。 # ECMAScript 5 [12,

  • 问题内容: 我正在寻找一种非常快速,干净且有效的方法来获取以下JSON切片中的最大“ y”值: for-loop是解决此问题的唯一方法吗?我热衷于使用。 问题答案: 要在中找到对象的最大值:

  • 我试图写一个函数来找出数组(1D)中任意2个元素之间的最大差异。我已经用几种方法解决了它(我在Java中应用) 具有2个嵌套循环(工作、查找差异并取最大值) 进行1次循环迭代(工作,在返回最小值和最大值的差值:(max-min)) 两次使用stream(工作,用stream的min()和max()函数查找最大值和最小值,并返回差异)。

  • 问题内容: 我的代码没有给出错误,但是没有显示最小值和最大值。代码是: 我是否需要system.out.println()来显示它,否则返回应该起作用吗? 问题答案: 您正在调用方法,但不使用返回的值。

  • 这是一个非常基本的算法(不能再简单了),但我被难住了。我们有一个元素数组,我们必须确定最小值和最大值。 通常的方法是遍历数组,找出最小值和最大值,即2n比较。 稍微有效的方法是首先对数组的连续元素进行比较,以确定任意两个元素的最大值和最小值(N/2比较)。我们现在有n/2 min和n/2 max元素。现在我们可以在n/2+n/2+n/2(前一步)=3/2*n或1.5n中得到最终的max和min 那