【发布时间】:2015-03-06 07:08:07
【问题描述】:
这是我在面试中被问到的问题。
找到数组的最小值和最大值的最佳时间复杂度是多少?
我回答: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)。如果我是正确的,仅仅应用分而治之并不总能降低复杂性。
如果我理解这个算法仍然是 O(n),请纠正我。
谢谢
【问题讨论】:
-
问题本身(迭代/划分&征服)和标题(二分查找)之间有什么联系?
标签: algorithm time-complexity binary-search divide-and-conquer