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 in ascending from left to right.
- Integers in each column are sorted in ascending from top to bottom.
For example,
Consider the following matrix:
[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]
Given target = 5
, return true
.
Given target = 20
, return false
.
思路:每行进行遍历,判断每行第一个是否小于目标,如果是则对该行进行二分查找,如果不是则说明这行以及下边所有行都不会存在目标,返回false
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length==0){
return false;
}
if(matrix[0].length==0){
return false;
}
for(int i=0;i<matrix.length;i++){
if(target<matrix[i][0]){
return false;
}
if(binarySearch(matrix[i],0,matrix[i].length-1,target)){
return true;
}
}
return false;
}
public boolean binarySearch(int[] nums,int start,int end,int target){
if(start>end){
return false;
}
int medium=(start+end)/2;
if(target==nums[start]||target==nums[end]||target==nums[medium]){
return true;
}else{
if(target>nums[medium]){
return binarySearch(nums,medium,end-1,target);
}else{
return binarySearch(nums,start+1,medium,target);
}
}
}
}