leetCode-Search a 2D Matrix

来源:互联网 发布:淘宝讲师 编辑:程序博客网 时间:2024/06/07 20:20

Description:
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

   Integers in each row are sorted from left to right.   The first integer of each row is greater than the last integer of the previous row.

For example,

Consider the following matrix:

[  [1,   3,  5,  7],  [10, 11, 16, 20],  [23, 30, 34, 50]]

Given target = 3, return true.

My Solution:

//先对行二分查找,等到确认target可能在哪一行后再对列二分查找class Solution {    public boolean searchMatrix(int[][] matrix, int target) {        if(matrix.length == 0 || matrix[0].length == 0){            return false;        }        int up = 0,down = matrix.length - 1;        int middle = (up + down) / 2;        int columns = matrix[0].length - 1;        while(up <= down){            if(matrix[middle][columns] == target){                return true;            }            if(matrix[middle][columns] < target){                up = middle + 1;            }else{                if(target >= matrix[middle][0]){                    int left = 0;                    int right = columns;                    int lastmiddle = (left + right) / 2;                    while(left <= right){                        if(matrix[middle][lastmiddle] == target){                            return true;                        }                        if(matrix[middle][lastmiddle] < target){                            left = lastmiddle + 1;                        }else{                            right = lastmiddle - 1;                        }                            lastmiddle = (left + right) / 2;                    }                    return false;                }                else{                    down = middle - 1;                }            }                    middle = (up + down) / 2;        }                return false;    }}

Better Solution:

//由于matrix矩阵的特性,因此可以通过把matrix拉伸为一维的递增数组,然后通过二分查找解决,注意一维数组下标到二维数组下标的转换就可以了(行是下标除以列数,列是下标余列数)class Solution {    public boolean searchMatrix(int[][] matrix, int target) {        // write your code here        if(matrix == null || matrix.length == 0){            return false;        }        if(matrix[0] == null || matrix[0].length == 0){            return false;        }        int row = matrix.length;        int column = matrix[0].length;        int start = 0, end = row * column - 1;        while(start <= end){            int mid = start + (end - start) / 2;            int number = matrix[mid / column][mid % column];            if(number == target){                return true;            }else if(number > target){                end = mid - 1;            }else{                start = mid + 1;            }        }        return false;    }}

Best Solution:

//也是利用matrix的特性,既然matrix[matrix - length - 1][0]大于matrix之前的所有元素,那么我们可以从最后一行开始找。首先初始化i为matrix最后一行,j为第一列。如果target > matrix[i][j],说明target就在i这一行中,那么递增j直到找到target就可以了(如果有的话),如果target < matrix[i][j],那么递减i,从上一行找就可以了public class Solution {    public boolean searchMatrix(int[][] matrix, int target) {        if(matrix == null || matrix.length ==0 || matrix[0].length == 0) {            return false;        }        int i = matrix.length-1;        int j =0;        while(i >= 0 && j <= matrix[0].length -1) {        if(matrix[i][j] == target) {            return true;        } else if(matrix[i][j] > target) {             i --;        } else {            j++;        }        }        return false;    }}