【发布时间】:2018-07-18 09:17:09
【问题描述】:
给定 2 个不同长度的未排序数组 A 和 Q。对于 Q 中的每个元素,找出 A 中差异最小的元素。
int[] findSmallestDifference(int A[], int Q[]){
int []result = new int[Q.length];
// insert code to find difference for each Q
return result;
}
我在面试时遇到了这个问题,我提供了几个解决方案,但提到它还不是最佳的。
我提供的解决方案:
- 蛮力:foreach A,foreach Q 计算差异,O(A*Q)
- 对数组 A 进行排序,对 Q 的每个元素进行排序,执行二进制搜索以找到最小的 差,O(AlogA + QlogA)
- 对 A 和 Q 进行排序,然后我们在每个数组上都有两个指针来查找差异,O(AlogA + QlogQ)
我没有想到的最佳解决方案是什么?
【问题讨论】:
-
对于第三种方法,时间复杂度为 O( max( A log A, Q log Q))
-
就时间复杂度而言,没有比您的方法 2 和 3 更优化的解决方案了。