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
.
思路:首先對矩陣第一列進行二分查找,定位爲行下標index,滿足matrix[index][0] < target && matrix[index+1][0] > target
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int start = 0;
int end = matrix.length - 1;//指向最後一個元素
int pivot = 0;
if(end == -1){
return false;
}
while(start <= end){//是小於等於
pivot = (start + end) / 2;
if(target < matrix[pivot][0]){
end = pivot-1;//減少1
}else if(target > matrix[pivot][0]){
start = pivot+1;//增加1
}else{
return true;
}
}
int index;
if(target < matrix[pivot][0]){
index = pivot - 1;
}else {
index = pivot;
}
if(index < 0){
return false;
}
start = 0;
end = matrix[index].length - 1;
while(start <= end){
pivot = (start + end) / 2;
if(target < matrix[index][pivot]){
end = pivot -1;
}else if(target > matrix[index][pivot]){
start = pivot+1;
}else{
return true;
}
}
return false;
}
}