题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
参考代码
class Solution {
public:
vector<int> searchRange(vector<int> &nums, int target) {
vector<int> res;
if (nums.empty()) {
return {-1, -1};
}
res.push_back(getIndexOfFirstK(nums, target));
res.push_back(getIndexOfLastK(nums, target));
return res;
}
int getIndexOfFirstK(vector<int> &data, int target){
int left = 0;
int right = data.size() - 1;
while(left < right){
int mid = (left + right) >> 1;
if (data[mid] >= target) {
right = mid;
} else {
left = mid + 1;
}
}
// 不一定存在呀,所以要判断data[mid]是否满足需求
return data[left]==target? left: -1;
}
int getIndexOfLastK(vector<int> &data, int target){
int left = 0;
int right = data.size() - 1;
while(left < right){
int mid = (left + right + 1) >> 1;
if (data[mid] <= target) {
left = mid;
} else {
right = mid - 1;
}
}
// 不一定存在呀,所以要判断data[mid]是否满足需求
return data[left]==target? left: -1;
}
};
二分查找定位元素起止位置
本文介绍了一种在升序数组中寻找特定元素起始和结束位置的高效算法,采用二分查找策略实现O(logn)的时间复杂度。通过两个辅助函数分别定位目标值的首次和末次出现位置,最终返回这两个位置的索引。
784

被折叠的 条评论
为什么被折叠?



