文章目录
一、力扣34. 在排序数组中查找元素的第一个和最后一个位置
(一)两次遍历----时间复杂度O(N)
思路:从前往后遍历一次,记录下目标元素的第一次出现的下标;从后往前遍历一次,记录下目标元素最后一次出现的下标。
时间复杂度为O(N),空间复杂度为O(1)
代码如下:
class Solution
{
public:
vector<int> searchRange(vector<int>& nums, int target)
{
int start=-1,end=-1;
for(int i=0;i<nums.size();i++)
{
if(nums[i]==target)
{
start=i;
break;
}
}
for(int i=nums.size()-1;i>=0;i--)
{
if(nums[i]==target)
{
end=i;
break;
}
}
return {
start,end};
}
};
(二)二分法----时间复杂度O(logn)
思路:因为是排序好的数组,又要求时间复杂度为O(logn),所以很容易考虑到二分法。
我们可以利用二分法找到第一个target的位置和第一个大于target的位置,再将其减一即可
代码如下:
class Solution
{
public:
int Left(vector<int>& nums,int target)//找第一个目标元素出现的位置
{
int left=0,right=nums.size()-1;
while(left<=right)
{
int mid=(left+right