//给定一个有序整数数组,其中元素可能重复多次,编写一个函数来查找目标值在数组中第一次
// 和最后一次出现的位置。
// 如果目标值不存在于数组中,返回[-1, -1]。例如,对于数组[5,7,7,8,8,10]和目标值8,返回[3,4]。
//分别二分查找,避免嵌套循环
#include <iostream>
#include <vector>
using namespace std;
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
int low = 0;
int high = n - 1;
int first = -1;
int last = -1;
// 查找第一次出现的位置
while (low <= high) {
int mid = (low + high) / 2;
if (nums[mid] >= target) {
high = mid - 1;
}
else {
low = mid + 1;
}
if (nums[mid] == target) {
first = mid;
}
}
// 查找最后一次出现的位置
low = 0;
high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (nums[mid] <= target) {
low = mid + 1;
}
else {
high = mid - 1;
}
if (nums[mid] == target) {
last = mid;
}
}
vector<int> result = { first, last };
return result;
}
int main() {
vector<int> nums = { 5, 7, 7, 8, 8, 10 };
int target = 8;
vector<int> result = searchRange(nums, target);
cout << "First and last occurrence of " << target << " is: [" << result[0] << ", " << result[1] << "]" << endl;
return 0;
}
//输出样例:First and last occurrence of 8 is: [3, 4]