题目是在一个有序的二维矩阵里搜索,可以用典型的二分搜索法,我之前用的是两次二分,但是比较麻烦,后来在网上看到一个一次二分的方法,把整个数组当作一个数列,然后二分,定位在二维数组里即可。
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix==null || matrix.length==0 || matrix[0].length==0)
return false;
int start = 0, end = matrix.length*matrix[0].length-1;
while(start<=end){
int mid=(start+end)/2, midX=mid/matrix[0].length,
midY=mid%matrix[0].length;
if(matrix[midX][midY]==target) return true;
if(matrix[midX][midY]<target){
start=mid+1;
}else{
end=mid-1;
}
}
return false;
}
Update 2015/08/22:这道题还有一个2,第二题的思路比较巧妙,只需要从左下角或者右上角开始即可。
public class Solution {
/**
* @param matrix: A list of lists of integers
* @param: A number you want to search in the matrix
* @return: An integer indicate the occurrence of target in the given matrix
*/
public int searchMatrix(int[][] matrix, int target) {
// write your code here
if (matrix==null || matrix.length==0 || matrix[0].length==0) return 0;
int m = matrix.length;
int n = matrix[0].length;
int count = 0;
int row = m-1;
int col = 0;
while (row>=0 && col<n) {
int cur = matrix[row][col];
if (cur == target) {
count++;
col++;
row--;
}
else if (cur > target) {
row--;
}
else col++;
}
return count;
}
}