我的方法在O(n)时间内查看某个值是否在2D数组中有什么问题?

时间:2017-01-27 22:56:53

标签: java multidimensional-array big-o

我正在尝试编写一个采用2D数组的方法(排列方式使每行中的元素从左到右依次递增,每列中的元素从上到下依次递增)一个int,并查看int是否在2D数组中。我想使用嵌套循环,但这会使它进入O(N ^ 2)时间。因此,我正在尝试制作条件,以便测试int是否小于其中一个子数组中的第一个并且大于最后一个,如果是,则进入下一个子数组。这就是我所拥有的:

 static boolean has(int number, int[][] a) {
    int q = 0;
    boolean c = false;

    for (int i = 0; i < a[q].length-1; i++){
      if ((number < a[i][q]) || (number > a[a[j].length-1][i])){
        q++;
      }
      else if (number == a[i][q]){
        c = true;
        break;
      }
      else c = false;
    }
    return c;
  }

可以使用一些帮助。这个方法编译但是给了outOfBounds谢谢!

2 个答案:

答案 0 :(得分:0)

该解决方案以O(n + m):

运行
static boolean has(int number, int[][] a) {
    int row = 0;
    int col = a[0].length - 1;
    while (row < a.length && col >= 0) {
        int n = a[row][col];
        if (n < number) {
            row++;
        } else if (n > number) {
            col--;
        } else {
            return true;
        }
    }
    return false;
}

答案 1 :(得分:0)

您可以在O(log(n)+ log(m))中解决此问题,首先找到包含您要使用二进制搜索查找的整数的行(因为列已排序),然后找到确切的位置该行中的整数,通过执行另一个二进制搜索(因为行已排序)。