//函数名:rightBound //参数:size——数组的长度,target——目标值,left——左边界,right——右边界 //返回值:返回目标值在数组中最右边的位置,如果不存在则返回-1

int rightBound(int size, int target, int left, int right) {
left = 0; //初始化左边界为0 right = size - 1; //初始化右边界为数组长度减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) { //如果中间值等于目标值 left = mid + 1; //将左边界移动到中间值右侧 }
}
if (right < 0 || nums[right] != target) //如果右边界小于0或者右边界所在位置的元素不等于目标值 return -1; //返回-1 return right; //否则返回右边界 }

举例说明:

假设数组nums为[1,2,2,2,3,4,5],目标值target为2。

left=0,right=6。

第一次循环,mid=3,nums[mid]=2,将left移动到mid+1=4。

第二次循环,mid=5,nums[mid]=4,将right移动到mid-1=4。

第三次循环,mid=4,nums[mid]=3,将right移动到mid-1=3。

第四次循环,mid=3,nums[mid]=2,将left移动到mid+1=4。

此时left=right=4,退出循环。

最后判断nums[right]是否等于target,发现等于,返回right=4。

所以,目标值2在数组nums中最右边的位置为4

int rightBoundint size int targetint leftint right left = 0; right = size - 1; while left = right int mid = left + right - left 2; if numsmid target

原文地址: https://www.cveoy.top/t/topic/eOrJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录