题目链接:34. 在排序数组中查找元素的第一个和最后一个位置。
在这里我们可以用暴力的解法:就是一次判断,第一次遇见的元素==target,和最后一次遇见的,就保存起来
但是这样暴力解法时间复杂度为O(N)。时间复杂度超出了题目意思。
优化解法:因为数组是有序的,我们可以根据二分查找思想来进行解决,
利用二短性来进行,左右分段来查询边界
思路画图所示:
cpp
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left1 = 0, left2 = 0, right1 = nums.size() - 1, right2 = nums.size() - 1;
if (right1 < 0) return { -1,-1 }; //当是空数组时,right会小于0,这时直接退出就行
while (left1 < right1)//不能等于,如果等于就会,一直right1 = mid1死循环
{
int mid1 = left1 + (right1 - left1) / 2;//优先左取整
if (nums[mid1] < target) left1 = mid1 + 1;
else if (nums[mid1] >= target) right1 = mid1;
}
while (left2 < right2)
{
int mid2 = left2 + (right2 - left2 + 1) / 2;//优先右取整
if (nums[mid2] <= target) left2 = mid2;
else if (nums[mid2] > target) right2 = mid2 - 1;
}
if (nums[right1] != target && nums[left2] != target) return { -1,-1 };//最后判断所处位置如果不是target,肯定不存在,直接返回
return { right1,left2 };
}
};