二分查找能解决从给定的一组有顺序的数中查找出某一个数这类问题。它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
left 为序列开始
mid 为序列中间
right 为序列结束位置
value 为查找的关键字
(默认序列为升序)思路就是先将序列中间位置记录的关键字mid与需要查找的关键字value比较,如果相同则查找成功,否则利用中间位置mid将序列分为左右两个子序列,如果关键字大于mid对应的值,则令left=mid+1,如果小于mid令right=mid-1;
然后再判断left<=right,然后重复上边的操作,直到找到满足条件的记录,或者直到子表不存在也就是left<=right不成立为止,此时为查找不成功。
举例代码如下:
写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。
这个矩阵具有以下特性:
- 每行中的整数从左到右是排序的。
- 每一列的整数从上到下是排序的。
- 在每一行或每一列中没有重复的整数。
考虑下列矩阵:
[
[1, 3, 5, 7],
[2, 4, 7, 8],
[3, 5, 9, 10]
]
给出target = 3,返回 2
public boolean searchMatrix(int[][] matrix, int target) {
int row = matrix.length;
int col = matrix[0].length;
int len = row*col;
int left = 0;
int right = len-1;
if(matrix.length==0){
return false;
}else{
if(matrix.length==1&&matrix[0].length==1){
return false;
}
while(left<=right) {
int mid = left + (left+right)/2;
int num = matrix[mid/row][mid%col];
if(num==target) {
return true;
}else {
if(num>target) right=mid-1;
left = mid+1;
}
}
}
return false;
// write your code here
}