查找算法:二分法实现过程
一、闭合区间模板
int binarySearch(int* nums, int numsSize, int target)
{
int begin = 0;
int end = numsSize - 1;
int mid;
while (begin <= end) {
mid = (begin + end) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
end = mid - 1;
} else if (nums[mid] < target) {
begin = mid + 1;
}
}
// 未找到
return -;
}
二、关键点分析
1、初始值:闭区间模板,自然是包括[begin, end],end的大小为数组长度-1;
2、while循环条件:由于为闭区间,所以begin和end均可能取到,其重合时也可能会取到,因此需要begin<=end;
3、中间值mid:此处简单的平均begin和end即可,不需要多余处理(不会溢出);
4、目标值大于中间值:目标值在右半区间,即[mid, end],由于mid已经判断过了,后续无须再次判断,因此判断区间为[begin=mid+1, end];
5、目标值小于中间值:目标值在左半区间,即[begin, mid], 由于mid已经判断过了,区间改成[begin, end=mid-1]
三、leetcode35:搜索插入位置
int searchInsert(int* nums, int numsSize, int target)
{
int begin = 0;
int end = numsSize - 1;
int mid;
while (begin <= end) {
mid = (begin + end) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
end = mid - 1;
} else if (nums[mid] < target) {
begin = mid + 1;
}
}
// 当数组中无该数时,进行处理
return nums[mid] < target ? mid + 1 : mid;
}
四、leetcode74:搜索二维矩阵
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target)
{
int begin = 0;
int end = matrixSize * (*matrixColSize) - 1;
int mid;
int midVal;
while (begin <= end) {
mid = (begin + end) / 2;
// 二维数组索引转换
midVal = matrix[mid / (*matrixColSize)][mid % (*matrixColSize)];
if (midVal == target) {
return true;
} else if (midVal > target) {
end = mid - 1;
} else {
begin = mid + 1;
}
}
return false;
}