问题描述
问题陈述-
给出m个数组,每个数组都按升序排序。现在您可以从两个不同的数组中选取两个整数(每个数组都选取一个)并计算距离。我们将两个整数a和b之间的距离定义为它们的绝对差| a-b |。您的任务是找到最大距离。
示例-
Input:
[[1,2,3],[4,5],[1,3]]
Output: 4
我的方法-由于对数组进行了排序,因此在最终答案中,一个元素将来自数组的第一个索引,其他元素将来自数组的最后一个索引。因此,我能够提供一种强力解决方案,以获取答案。基本上,我正在生成一个数组的最后一个元素和另一个数组的第一个元素的所有可能组合。这使我的TC为O(n ^ 2)。 如何优化方法。 ?
解决方法
这很简单。
- 维护具有所有列表中最小值的最小变量。
- 在包括当前最小值之前,计算当前最小值与当前列表最大值之间的差异。
- 从第一个到最后一个,从最后一个到第一个,执行步骤2。
- 通过这种方式,您将考虑最小和最大的所有可能性,而不必为每个可能性进行生成或计算。
代码段:
public int maxDistance(List<List<Integer>> arrays) {
int max_diff = 0,min = arrays.get(0).get(0);
for(int i=1;i<arrays.size();++i){
List<Integer> curr = arrays.get(i);
max_diff = Math.max(max_diff,Math.abs(curr.get(curr.size()-1) - min));
min = Math.min(min,curr.get(0)); // take min afterwards
}
min = arrays.get(arrays.size()-1).get(0);
for(int i=arrays.size()-2;i>=0;--i){
List<Integer> curr = arrays.get(i);
max_diff = Math.max(max_diff,curr.get(0)); // take min afterwards
}
return max_diff;
}
- 时间复杂度:O(n),空间复杂度:O(1)。
正如您正确观察到的,只有数组的最小和最大元素才有意义。您可以在n
中找到最少的O(n)
个排序数组,在O(n)
中找到最大的数组,答案似乎是max - min
,即O(1)
。 / p>
如果我们不允许max和min属于 same 数组,则问题会更加棘手。在那种情况下,蛮力解决方案(考虑所有最小-最大组合)将再次需要O(n^2)
计算。但是您可以做得更好:
-
构建一个二维数组
m
,使得m[i][0] = min(array[i])
和m[i][1] = i
;对其进行升序排序,以使m[j][0] <= m[j+1][0]
(成本:O(n log n)
) -
使用
M
和M[i][0] = max(array[i])
构建另一个二维数组m[i][1] = i
;将其降序排列,使m[j][0] >= m[j+1][0]
(成本:O(n log n)
) -
检查是否
m[0][1] != M[0][1]
,- 如果为true,则可以放心返回
M[0][0] - m[0][0]
- 否则,结果将为
max(M[0][0] - m[1][0],M[1][0] - m[0][0])
- 如果为true,则可以放心返回
通过跟踪最大,第二大,最小和第二最小的元素及其数组索引,可以避免对m
和M
进行完全排序(成本降低了{ {1}})-但是在比赛中进行编程时,简单而最佳的编写通常要比真正最佳但要编写的要好。
您可以在线性时间内执行此操作:
-
查找总体具有至少两个值的两个数组。为此,您需要扫描所有输入数组的第一个值。我们将这两个数组称为A和B,其中A [0]
-
查找两个数组,它们的总和为两个最大值。为此,您需要扫描所有输入数组的最后一个值。我们将这两个数组称为C和D,其中C [last]> = D [last]和D [last]> =所有X [last],其中X!= C
-
如果A!= C,则返回C [last]-A [0]
-
否则,以下两个表达式中的最大值:D [last]-A [0]和C [last]-B [0]
JavaScript的实现
// Loader Alias
$loader = AliasLoader::getInstance();
// SANCTUM CUSTOM PERSONAL-ACCESS-TOKEN
$loader->alias(\Laravel\Sanctum\PersonalAccessToken::class,\App\Models\Sanctum\PersonalAccessToken::class);