Find_Right_Boundary(vector<int>& nums, int target)
- 目的:找到
target
右侧的边界,即数组中大于target
的最小索引。 - 如果
target
大于等于中间值,说明target
可能在右侧或者就是中间值,移动left
指针并更新result
为left
。 - 如果
target
小于中间值,说明target
在左半部分,移动right
指针。
Find_Left_Boundary(vector<int>& nums, int target)
- 目的:找到
target
左侧的边界,即数组中小于target
的最大索引。 - 如果
target
大于中间值,说明target
在右半部分,移动left
指针。 - 如果
target
小于等于中间值,移动right
指针,并更新result
为right
。这是因为我们试图找到小于target
的最大索引。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int leftBorder = Find_Left_Boundary(nums, target);
int rightBorder = Find_Right_Boundary(nums, target);
// 情况一
if (leftBorder == -2 || rightBorder == -2) return {-1, -1};
// 情况三
if (rightBorder - leftBorder > 1) return {leftBorder + 1, rightBorder - 1};
// 情况二
return {-1, -1};
}
private:
int Find_Left_Boundary(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int result = -2;
while (left <= right) {
int mid = (left + right) / 2;
if (target > nums[mid]) {
left = mid + 1;
}else if (target <= nums[mid]){
right = mid -1;
result = right;
}
}
return result;
}
int Find_Right_Boundary(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int result = -2;
while (left <= right) {
int mid = (left + right) / 2;
if (target >= nums[mid]) {
left = mid + 1;
result = left;
}else if (target < nums[mid]){
right = mid -1;
}
}
return result;
}
};