目录
一、二分查找的两种写法
二分查找也成为折半查找(Binary Search),它是一种效率较高的查找方法。但是该方法要求待查找的序列必须是有序的,即序列中所有的元素都是按照升序(递增)或降序(递减)排列的。
二分查找的思想很简单,即选择序列中间的数字和目标值进行比较(假设序列是按升序排列的):
-
如果中间的数字小于目标值,说明包括中间数字在内的左半边区间的所有数字都小于目标值,可以全部排除。
-
如果中间的数字大于目标值,说明包括中间数字在内的右半边区间的所有数字都大于目标值,可以全部排除。
-
如果中间的数字等于目标值,则直接返回答案。
练习:704. 二分查找。
1.1 - 第一种写法(左闭右闭)
左闭右闭,即每次查找的区间为 [left, right]
。
int binarySearch(int arr[], int size, int target)
{
int left = 0;
int right = size - 1;
while (left <= right)
{
int mid = (left + right) / 2;
// int mid = left + (right - left) / 2;
if (arr[mid] < target)
{
left = mid + 1;
}
else if (arr[mid] > target)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
1.2 - 第二种写法(左闭右开)
左闭右开,即每次查找的区间为 [left, right)
,此时 arr[right]
不存在或者不符合条件。因此写法二的代码要做如下几处的修改:
-
right
要初始化为size
。 -
while
的循环条件应该改为left < right
。 -
当
arr[mid] > target
时,right = mid
。
int binarySearch(int arr[], int size, int target)
{
int left = 0;
int right = size;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] < target)
{
left = mid + 1;
}
else if (arr[mid] > target)
{
right = mid;
}
else
{
return mid;
}
}
return -1;
}
二、二分查找的六种变形
2.1 - 查找第一个 = target 的元素位置
此时待查找的序列是按照非递减或者按非递增的顺序排列的,