时间复杂度为O(n)的算法:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int>index;
for(int i=0;i<nums.size();i++){
if(nums[i]==target)
index.push_back(i);
}
if(index.size()==1)
return {index[0],index[0]};
else if(index.size()>1)
return{index[0],index[index.size()-1]};
else
return{-1,-1};
}
};
创建vector数组,遍历给定的数组并将与目标值相同的元素的下标,放入新数组中。再通过新数组.size()方法得出与目标值相同元素的位置。
时间复杂度为O(lg n)的算法
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> result(2, -1);
int left = 0;
int right = nums.size() - 1;
// 第一个二分查找,寻找开始位置
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
result[0] = mid;
right = mid - 1; //继续在左边寻找开始位置
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
// 如果开始位置仍然是初始值 -1,说明数组中不存在目标值,直接返回 {-1, -1}
if (result[0] == -1) {
return result;
}
left = 0;
right = nums.size() - 1;
// 第二个二分查找,寻找结束位置
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
result[1] = mid;
left = mid + 1; //继续在右边寻找结束位置
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return result;
}
};