int rightBoundint size int targetint leftint right left = 0; right = size - 1; while left = right int mid = left + right - left 2; if numsmid target
//函数名: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
原文地址: https://www.cveoy.top/t/topic/eOrJ 著作权归作者所有。请勿转载和采集!