10.1 二分查找
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 10.3 二分查找边界 - Hello 算法 (hello-algo.com)
由于 𝑖 和 𝑗 都是 int
类型,因此 𝑖+𝑗 可能会超出 int
类型的取值范围。为了避免大数越界,通常采用公式
\(𝑚=⌊𝑖+(𝑗−𝑖)/2⌋\)
来计算中点
1. (𝑗−𝑖):计算索引距离
2. (𝑗−𝑖)/2:计算距离的一半
3. 𝑚=⌊𝑖+(𝑗−𝑖)/2⌋:将距离的一半加到起始索引i
上,得到中点
C语言中,整数除以另一个整数时,结果会自动向下取整(即舍弃小数部分)
//二分查找
int search(int* nums, int numsSize, int target) {
int left = 0;
//长度-1为数组索引最后一位
int right = numsSize - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] < target)
left = mid + 1;
else if(nums[mid] > target)
right = mid - 1;
else
return mid;
}
return -1;
}
//二分查找插入点
int searchInsert(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] < target)
left = mid + 1;
else if(nums[mid] > target)
right = mid - 1;
else
return mid;
}
//倘若元素不存在,当二分查找结束,left会指向第一个大于目标值的位置
return left;
}