在排序数组中查找元素的第一个和最后一个位置
题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
解题思路
因为对时间复杂度有要求,所以直接暴力搜索应该是不行,就采取了二分查找。先用二分查找定位 target 所在位置,当然如果没有找到直接返回[-1, -1] 就行了。找到 target 的位置之后,从该位置向两边搜素定位边界即可。
代码(C++)
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans;
int left = 0, right = nums.size()-1;
int mid = 0, flag = 0;
while(left <= right){
mid = (left + right) / 2;
if(nums[mid] > target)
right = mid-1;
else if(nums[mid] < target)
left = mid+1;
else{
flag = 1;
break;
}
}
if(flag == 0){
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
for(int i = mid; i >= 0; i--){
if(i == 0 && nums[i] == target)
ans.push_back(i);
if(nums[i] != target){
ans.push_back(i+1);
break;
}
}
for(int j = mid; j < nums.size(); j++){
if(j == nums.size()-1 && nums[j] == target)
ans.push_back(j);
if(nums[j] != target){
ans.push_back(j-1);
break;
}
}
return ans;
}
};