首页 > 代码库 > 74. Search a 2D Matrix

74. Search a 2D Matrix

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.

思路:从top开始比较每一行的最后一个数,如果大于target,那么就在这一行。然后用binary search即可。

public class Solution {    public boolean searchMatrix(int[][] matrix, int target) {        int h=matrix.length-1;        int l=matrix[0].length-1;        int i=0;        while(i<=h)        {            if(matrix[i][l]>=target)            {                int low=0;                int high=matrix[0].length-1;                while(low<=high)                {                    int mid=low+(high-low)/2;                    if(matrix[i][mid]==target)                    {                        return true;                    }                    else if(matrix[i][mid]<target)                    {                        low=mid+1;                    }                    else                    {                        high=mid-1;                    }                }                return false;            }            i++;        }        return false;    }}

Solution2:

discussion有种非常好的解法,相当于把matrix摊开,当作1d array来做。

长度=Row*Col

Index= matrix[mid/col][mid/row]

1 2 3 4- [2/4][2%4]

public class Solution {    public boolean searchMatrix(int[][] matrix, int target) {        int row=matrix.length,col=matrix[0].length;        int l=0,r=row*col-1;        while(l<=r){            int mid=(r+l)/2;            if(matrix[mid/col][mid%col]==target){                return true;            }else if(matrix[mid/col][mid%col]<target){                l=mid+1;            }else{                r=mid-1;            }        }        return false;    }}

 

74. Search a 2D Matrix