LeetCode_34. 在排序数组中查找元素的第一个和最后一个位置
原创
©著作权归作者所有:来自51CTO博客作者晴天码字的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目描述:
给定一个按照升序排列的整数数组 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]
算法思想:有题目给定的时间复杂度可断定,这是一个用二分查找的题目,需要做的就是查找跟给定目标值相等的第一个元素个最后一个元素的位置。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int start=0;
int end=nums.size()-1;
while(start<=end){
int mid=(start+end)/2;
if(nums[mid]==target){
int i=mid;
int j=mid;
//j往前找第一个元素,需要用小于等于号,因为只有一个元素是target时,即是第一个元素也是最后一个元素
while(start<=j-1&&nums[j-1]==nums[mid])
j--;
//i往后找第一个元素
while(i+1<=end&&nums[i+1]==nums[mid])
i++;
return {j,i};
}
else if(target<nums[mid])
end=mid-1;
else
start=mid+1;
}
return {-1,-1};
}
};