这是我在面试中被问到的问题。
如何获得查找数组最小值和最大值的最佳时间复杂度?
我的回答是:O(n)。遍历整个数组,同时跟踪迄今为止找到的最大值和最小值。非常简单直接。
面试官问我能否使用分治法来改进它,我说可能不行。然后对话继续进行,最后我被要求实现分治法。
以下是具体实现:
public class MinMaxInArray {
public static int[] findMinMax(int[] array, int i, int j){
// base cases
int arrLen = j - i + 1;
if (arrLen == 1)
return new int[]{array[i], array[j]}; //j and i are the same
if (arrLen == 2){
int min = Math.min(array[i], array[j]);
int max = Math.max(array[i], array[j])
return new int[]{min, max};
}
// actual divide and conquer
int mid = i + (j-i)/2;
int[] leftMinMax = findMinMax(array, i, mid);
int[] rightMinMax = findMinMax(array, mid+1, j);
return new int[]{ Math.min(leftMinMax[0], rightMinMax[0]), Math.max(leftMinMax[1], rightMinMax[1]) };
}
public static void main(String[] args){
int[] array = {20, 5, 7, 25, 30, 1, 9, 12};
int[] minMax= findMinMax(array, 0, array.length - 1); //minMax[0] = minimum value, minMax[1] = maximum value
System.out.println("min = " + minMax[0] + ", max = " + minMax[1] );
}
}
我相信这仍然是O(n),因为所有元素都被比较了。但是面试官坚持认为它是O(log n),并让我思考一下。我想了很久,我确信它是O(n)。如果我正确的话,仅仅应用分治法并不能总是降低复杂度。
如果我的理解有误,请纠正我,谢谢。