二维数组中的搜索元素

时间:2015-08-26 13:23:28

标签: arrays algorithm

我最近在接受采访时被问到这个问题:

  

给定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)

中完成

1 个答案:

答案 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);

}