int leftBoundint size int targetint leftint right left = 0; right = size-1; while left = right int mid = left + right - left 2; if numsmid target lef
int leftBound(int size, int target, int left, int right) { // 初始化左右边界 left = 0; right = size-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 if (nums[mid] == target) right = mid - 1; } // 如果左边界超出范围或左边界的数不等于目标值,说明不存在目标值 if (left >= size || nums[left] != target) return -1; // 返回左边界 return left; }
例子:在数组 [1, 2, 2, 3, 3, 3, 4, 4, 5, 6] 中找到第一个等于 3 的数的索引。
-
初始时,left = 0,right = 9,mid = (0+9)/2 = 4,nums[mid] = 3,所以将 right 改为 mid-1 = 3。
-
再次执行循环,left = 0,right = 3,mid = (0+3)/2 = 1,nums[mid] = 2,所以将 left 改为 mid+1 = 2。
-
再次执行循环,left = 2,right = 3,mid = (2+3)/2 = 2,nums[mid] = 2,所以将 left 改为 mid+1 = 3。
-
再次执行循环,left = 3,right = 3,mid = (3+3)/2 = 3,nums[mid] = 3,所以将 right 改为 mid-1 = 2。
-
再次执行循环,left = 3,right = 2,此时 left > right,跳出循环。
-
判断 left 是否超出数组范围或左边界的数是否等于目标值,发现不符合条件,返回 left = 3。
因此,第一个等于 3 的数的索引为 3
原文地址: https://www.cveoy.top/t/topic/eOrx 著作权归作者所有。请勿转载和采集!