一,二分查找
二分查找是一种在有序数组中查找一特定的元素的搜索算法。它是通过把数组分成两部分,并将目标元素与中间值比较,从而确定目标元素所在的部分,然后继续在该部分进行查找,重复此过程直到确定目标元素不存在或把该元素找到为止。
1,左闭右闭区间 [left, right]
在二分查找中 左闭右闭区间 [left, right] 表示搜索范围,表示着搜索范围包含左右边界索引指向的元素。
left 表示搜索区间的起始索引,而 right 表示搜索区间的结束索引,并且 left 和 right 所指向的元素都在区间里面,所以判断条件要加上当 left 等于 right 时,该区间仍包含一个元素,需要检查。
#include<stdio.h>
int binarySearch(int *nums,int numsSize,int target){
int left=0;
int right=numsSize-1;
int middle=0;
while(left<=right){
middle=left+(right-letf)/2;
if(nums[middle]==target){
return middle;
}else if(nums[middle]>target){
right=middle-1;
}else{
left=middle+1;
}
}
return -1;
}
1.对上述的代码当检查区间是 左闭右闭区间 [left, right] 是由于区间内包含左右双指针所指向的元素,所以判断条 left==right 时,搜索区间是 [left, right] ,这个区间依然有一个元素所以要进行检查,查看这一个元素符不符合目标条件。
2.如果 nums[middle] > target 表示这 target 不在包含 nums[middle] 的位置,况且是闭区间所以 middle 处的值比 target 大,所以 target 应该在 [left, middle - 1] 这个范围里。
3.当 nums[middle] < target 时说明目标元素 target 在当前搜索范围的右半部分。因为 nums[middle] 已经被检查过且比 target 小,所以我们将 left 更新为 middle + 1,这样新的搜索范围变成 [middle + 1, right]。
同样,middle 位置的元素已经不符合要求,将其从搜索范围中移除,缩小搜索范围。
2. 左闭右开区间 [left, right)
在二分查找算法中,使用左闭右开区间 [left, right) 表示搜索范围时,意味着搜索范围包含左边界 left 所指向的元素,但不包含右边界 right 所指向的元素。
left 表示搜索范围的起始索引,该位置的元素包含在搜索范围内。而 right 表示搜索范围的结束索引,但该位置的元素不在当前的搜索范围之内。
#include<#include>
int binarySearch(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize;
int middle = 0;
while (left < right) {
middle = left + (right - left) / 2;
if (nums[middle] == target) {
return middle;
} else if (nums[middle] > target) {
right = middle;
} else {
left = middle + 1;
}
}
return -1;
}
1.while (left < right) 当 left 等于 right 时,搜索范围是 [left, right),这个区间是空集,因为不包含 right 处的元素,所以无需检查,循环结束。
2.如果 nums[middle] > target 表示这 target 目标元素在 [left, middle) 范围内 的位置,由于 right 是开区间端点,将 right 更新为 middle,新的搜索范围变成 [left, middle),排除了 middle 元素。
3.当 nums[middle] 小于 target 时,说明目标元素在 [middle + 1, right) 范围内。
因此将 left 更新为 middle + 1,排除了 middle 元素