给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。用c++写一个代码
时间: 2024-11-22 12:41:56 浏览: 26
在C++中,你可以使用二分查找(Binary Search)算法来解决这个问题,因为题目要求的时间复杂度是O(log n)。以下是实现这个功能的一个示例代码:
```cpp
#include <vector>
#include <algorithm>
std::pair<int, int> searchRange(std::vector<int>& nums, int target) {
if (nums.empty()) {
return std::make_pair(-1, -1);
}
int left = 0;
int right = nums.size() - 1;
int start = -1; // 初始化结果
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
// 如果找到目标值,更新起始位置,并继续向右搜索范围的左边界
start = mid;
right = mid - 1; // 终止条件:一旦找到就不再往左找
} else if (nums[mid] < target) {
left = mid + 1; // 目标值大于当前中间元素,向右半部分搜索
} else {
right = mid - 1; // 目标值小于当前中间元素,向左半部分搜索
}
}
// 向右扩展范围,直到找到第一个大于target的位置或者到达数组结尾
while (start != -1 && start < nums.size() && nums[start] == target) {
start++;
}
// 返回起始和结束位置
return (start == -1) ? std::make_pair(-1, -1) : std::make_pair(start, start);
}
// 示例
int main() {
std::vector<int> nums = {5, 7, 7, 8, 8, 10};
int target = 8;
std::pair<int, int> result = searchRange(nums, target);
if (result.first != -1) {
std::cout << "Target found at positions [" << result.first << ", " << result.second << "]" << std::endl;
} else {
std::cout << "Target not found" << std::endl;
}
return 0;
}
```
阅读全文