Java 在二维排序数组中搜索元素

Java 在二维排序数组中搜索元素,java,multidimensional-array,time-complexity,binary-search,Java,Multidimensional Array,Time Complexity,Binary Search,我必须编写一个代码(作为练习)来接收2D(方形)按行和按列排序的数组和一个元素,如果数组中存在元素,则返回true 当我听到“排序”时,首先想到的是二进制搜索,但随后我意识到每行的最后一个元素并不一定比下一行的第一个元素小 因此,我发现最好的复杂度是O(n),并编写了以下代码: public static boolean findN(int[][] a, int x) { if (a.length == 0 || a[0].length == 0 || x > a[a.lengt

我必须编写一个代码(作为练习)来接收2D(方形)按行和按列排序的数组和一个元素,如果数组中存在元素,则返回true

当我听到“排序”时,首先想到的是二进制搜索,但随后我意识到每行的最后一个元素并不一定比下一行的第一个元素小

因此,我发现最好的复杂度是O(n),并编写了以下代码:

 public static boolean findN(int[][] a, int x) {
    if (a.length == 0 || a[0].length == 0 || x > a[a.length - 1][a[0].length - 1] || x < a[0][0]) {
        return false;
    }
    int LastRow = a.length - 1, Lastcol = a[0].length - 1, row = 0, col = 0;

    while (row <= LastRow) {
        if (a[row][col] == x) {
            return true;
        } else if (col < Lastcol) {
            col++;
        } else {
            col = 0;
            row++;
        }
    }
    return false;
}
  • 在意识到最好的复杂性将是O(n)之后,我在谷歌上搜索了这个 所以我几乎可以肯定我是对的(尽管有些人 他们声称他们可以在O(log(n))中完成,但我真的可以吗
  • 欢迎任何其他想法和改进,提前感谢大家

几个月前我遇到了一个类似的问题,下面是我发现的在O(logN+logM)中工作的代码[假设数组按行和列排序]

[…]但是我意识到每行的最后一个元素并不一定比下一行的第一个元素小。-在这种情况下,您无法实现O(logn)复杂性

简单二进制搜索:

static void binarySearch(int mat[][], int i, int j_low, int j_high, int x) { 
    while (j_low <= j_high) { 
        int j_mid = (j_low + j_high) / 2; 

        // Element found 
        if (mat[i][j_mid] == x) { 
            System.out.println ( "Found at (" + i  + ", " + j_mid +")"); 
            return; 
        } 

        else if (mat[i][j_mid] > x) 
            j_high = j_mid - 1; 

        else
            j_low = j_mid + 1; 
    } 

    System.out.println ( "Element no found"); 
} 

希望这有帮助。祝你好运

谢谢,但这对示例数组不起作用,17作为元素。我用一个示例添加了我的main方法,你能试试吗?“[…]但是我意识到每行的最后一个元素不一定比下一行的第一个元素小”-您的示例违反了此约束。刚刚注意到它并修复了example@HarshalParekh,在示例中对其进行了测试,30作为元素-不起作用。请注意,每行中的最后一个元素不必小于下一个元素
static void binarySearch(int mat[][], int i, int j_low, int j_high, int x) { 
    while (j_low <= j_high) { 
        int j_mid = (j_low + j_high) / 2; 

        // Element found 
        if (mat[i][j_mid] == x) { 
            System.out.println ( "Found at (" + i  + ", " + j_mid +")"); 
            return; 
        } 

        else if (mat[i][j_mid] > x) 
            j_high = j_mid - 1; 

        else
            j_low = j_mid + 1; 
    } 

    System.out.println ( "Element no found"); 
} 
static void sortedMatrixSearch(int mat[][], int n, int m, int x) { 
    // Single row matrix 
    if (n == 1) { 
        binarySearch(mat, 0, 0, m - 1, x); 
        return; 
    } 

    // Do binary search in middle column. 
    // Condition to terminate the loop when the 
    // 2 desired rows are found 
    int i_low = 0; 
    int i_high = n - 1; 
    int j_mid = m / 2; 
    while ((i_low + 1) < i_high) { 
        int i_mid = (i_low + i_high) / 2; 

        // element found 
        if (mat[i_mid][j_mid] == x) { 
            System.out.println ( "Found at (" + i_mid +", " + j_mid +")"); 
            return; 
        } 

        else if (mat[i_mid][j_mid] > x) 
            i_high = i_mid; 

        else
            i_low = i_mid; 
    } 

    // If element is present on  
    // the mid of the two rows 
    if (mat[i_low][j_mid] == x) 
        System.out.println ( "Found at (" + i_low + "," + j_mid +")"); 
    else if (mat[i_low + 1][j_mid] == x) 
        System.out.println ( "Found at (" + (i_low + 1)  + ", " + j_mid +")"); 

    // Ssearch element on 1st half of 1st row 
    else if (x <= mat[i_low][j_mid - 1]) 
        binarySearch(mat, i_low, 0, j_mid - 1, x); 

    // Search element on 2nd half of 1st row 
    else if (x >= mat[i_low][j_mid + 1] && x <= mat[i_low][m - 1]) 
    binarySearch(mat, i_low, j_mid + 1, m - 1, x); 

    // Search element on 1st half of 2nd row 
    else if (x <= mat[i_low + 1][j_mid - 1]) 
        binarySearch(mat, i_low + 1, 0, j_mid - 1, x); 

    // search element on 2nd half of 2nd row 
    else
        binarySearch(mat, i_low + 1, j_mid + 1, m - 1, x); 
} 
public static void main (String[] args) { 
    int n = 4, m = 5, x = 8; 
    int mat[][] = {{0, 6, 8, 9, 11}, 
                   {20, 22, 28, 29, 31}, 
                   {36, 38, 50, 61, 63}, 
                   {64, 66, 100, 122, 128}}; 

    sortedMatrixSearch(mat, n, m, x); 
}