一尘不染

面试问题:三个数组和O(N * N)

algorithm

假设我们有 三个 长度为 N的 数组,其中包含任意数量的type long。然后给我们一个数字 M
(相同类型),我们的任务是从每个数组中选择三个数字 A B C (换句话说 应该
从第一个数组中选择 A ,从第二个数组中选择 B ,从第三个数组中选择 C。 ),以使之和 A + B +
C = M

问题: 我们可以选择所有三个数字并得出 _O(N 2)的_时间复杂度吗?


插图:

数组是:

1) 6 5 8 3 9 2
2) 1 9 0 4 6 4
3) 7 8 1 5 4 3

中号 ,我们已经给出是 19 。那么我们的选择是从第一开始为 8 ,从第二开始为 4 ,从第三开始为 7


阅读 294

收藏
2020-07-28

共1个答案

一尘不染

这可以在O(1)空间和O(N 2)时间中完成。

首先让我们解决一个简单的问题:
给定两个数组,AB从每个数组中选取一个元素,以使它们的总和等于给定的number K

对两个采用O(NlogN)的数组进行排序。
取指针ij使其i指向数组的开始Aj指向的结尾B
找到总和A[i] + B[j]并与之比较K

  • 如果A[i] + B[j] == K我们已经找到了对A[i]B[j]
  • 如果A[i] + B[j] < K,我们需要增加总和,所以增加i
  • 如果A[i] + B[j] > K,我们需要减少总和,那么就减少j

排序后查找对的过程为O(N)。

现在让我们来解决原始问题。现在我们有了第三个数组C

所以现在的算法是:

foreach element x in C
  find a pair A[i], B[j] from A and B such that A[i] + B[j] = K - x
end for

外循环运行N时间,对于每次运行,我们执行O(N)操作,使整个算法为O(N 2)。

2020-07-28