我最近在接受采访时被问到这个问题:
给定2d整数数组,其中:
每行按从左到右排序。
每列都从上到下排序。
找到元素x的位置的最佳算法是什么?
我很开心,就像我之前做过的那样,这是我的回答:
从右上角开始。
如果那个位置的e大于x,那么肯定是所有元素 该列的大于x,我们将一列移回。
如果该位置的e小于x,则绝对是所有元素 e后面小于x,e后面的所有元素都大于x 所以我们向下移动一行,
如果e == x,我们会停止或继续这样做,直到我们到达左边界 或者在我们找到之前如果我们遇到边界的话 e == x,那么2d数组不包含该元素。
显然,这种方法的时间复杂度对于nXn矩阵是 O(n),但是访谈者坚持采用对数方法,而我无法到达 O附近的任何地方(log n)的即可。
我的问题是,可以在 O(log n)?
中完成答案 0 :(得分:2)
是的,可以做到,你只需要进行二分查找。
public int searchMatrix(ArrayList<ArrayList<Integer>> A, int B) {
int row, col;
int m, n;
if (A == null)
return 0;
m = A.size();
if (m == 0)
return 0;
n = A.get(0).size();
row = 0;
col = n - 1;
while (checkBound(row, col, m, n)) {
if (B == A.get(row).get(col))
return 1;
int num = A.get(row).get(col);
if (B < num)
col--;
else if (B > num)
row++;
}
return 0;
}
public boolean checkBound(int row, int col, int m, int n) {
return (row >= 0 && row < m && col >= 0 && col < n);
}