leet240搜索二维矩阵 II

不问归期 提交于 2019-12-09 19:08:56

在这里插入图片描述
我的代码

public static boolean searchMatrix(int[][] matrix, int target) {
    for (int i = 0; i < matrix.length; i++) {
        int left = 0;
        int right = matrix[i].length-1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (matrix[i][mid] > target)
                right = mid - 1;
            else if(matrix[i][mid] < target)
                left = mid + 1;
            else
                return true;
        }

}
return false;

官方的
时间复杂度:O(n+m)

public boolean searchMatrix(int[][] matrix, int target) {
    // start our "pointer" in the bottom-left
    int row = matrix.length-1;
    int col = 0;

    while (row >= 0 && col < matrix[0].length) {
        if (matrix[row][col] > target) {
            row--;
        } else if (matrix[row][col] < target) {
            col++;
        } else { // found it
            return true;
        }
    }

    return false;
}

对当前的行和列分别搜索
时间复杂度:O(lg(n!))

private static boolean binarySearch(int[][] matrix, int target, int start, boolean vertical) {
    int lo = start;
    int hi = vertical ? matrix[0].length-1 : matrix.length-1;

    while (hi >= lo) {
        int mid = (lo + hi)/2;
        if (vertical) { // searching a column
            if (matrix[start][mid] < target) {
                lo = mid + 1;
            } else if (matrix[start][mid] > target) {
                hi = mid - 1;
            } else {
                return true;
            }
        } else { // searching a row
            if (matrix[mid][start] < target) {
                lo = mid + 1;
            } else if (matrix[mid][start] > target) {
                hi = mid - 1;
            } else {
                return true;
            }
        }
    }

    return false;
}

public static boolean searchMatrix(int[][] matrix, int target) {
    // an empty matrix obviously does not contain `target`
    if (matrix == null || matrix.length == 0) {
        return false;
    }

    // iterate over matrix diagonals
    int shorterDim = Math.min(matrix.length, matrix[0].length);
    for (int i = 0; i < shorterDim; i++) {
        boolean verticalFound = binarySearch(matrix, target, i, true);
        boolean horizontalFound = binarySearch(matrix, target, i, false);
        if (verticalFound || horizontalFound) {
            return true;
        }
    }

    return false;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!