algorithm - 数组中的最大距离 | 竞争性编码问题
问题描述
问题陈述 -
给定 m 个数组,每个数组按升序排序。现在你可以从两个不同的数组中取出两个整数(每个数组选择一个)并计算距离。我们将两个整数 a 和 b 之间的距离定义为它们的绝对差 |ab|。你的任务是找到最大距离。
例子 -
Input:
[[1,2,3],
[4,5],
[1,2,3]]
Output: 4
我的方法 - 由于数组已排序,因此在最终答案中,一个元素将来自数组的第一个索引,而另一个元素将来自数组的最后一个索引。因此,我能够设计一个蛮力解决方案,以得到答案。基本上我正在生成一个数组的最后一个元素和另一个数组的第一个元素的所有可能组合。这给了我 O(n^2) 的 TC。我怎样才能优化我的方法。?
解决方案
这很简单。
- 维护具有所有列表最小值的最小变量。
- 在包括当前最小值之前,计算当前最小值与当前列表最大值的差异。
- 从第一个到最后一个,从最后一个到第一个执行第 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,Math.abs(curr.get(curr.size()-1) - min));
min = Math.min(min,curr.get(0)); // take min afterwards
}
return max_diff;
}
- 时间复杂度:O(n),空间复杂度:O(1)。
推荐阅读
- selenium - 在 JMeter WebDriver 采样器中使用 sendKeys 命令进行“多个同时按键”操作
- c - 将 scanf 与通过引用传递的结构一起使用
- c# - 如何在按钮按下时删除应用程序。?
- ios - 将图像添加到 MapBox 中的自定义 MGLAnnotationView
- java - TestNg 中的 NullPointerException
- memory-management - 使用哈希表会导致内存碎片吗?
- floating-point - mpmath 基本操作的实现细节
- python - Python 3 Selenium WebDriverWait 导致脚本永远挂起/冻结
- c++ - c++, 'avg = sum/5' 给了我垃圾值,但是写 avg = sum/2 给了我工作,我不知道为什么
- python - 在 R 中将表格打印为标签