解法1:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target)
{
vector<int> temps;
int i=0;//i记录位置
int temp=0;//用来区分初始位置和结束位置
for(auto m:nums)//遍历数组
{
if(m!=target) //如果与目标数不相等
{
i++; //位置+1
}
else //如果相等
{
if(temp==0) //标志为0,第一次相等,记录起始位置
{
temps.push_back(i);
temp=1;
}
if(temp==1) //标志为1,第二次相等,记录起始位置
{
temps.push_back(i);
temp=2;
}
if(temp==2) //标志为2,第n次相等,删除第n-1次相等记录
{
temps.pop_back();
temps.push_back(i);
}
i++;
}
}
if(temp==0) //如果没有遇到相等的
{
temps.push_back(-1);
temps.push_back(-1);
}
return temps;
}
};
解法二(二分查找):
int lowBorder(vector<int> &nums, int target)
{
int left=0; //左界赋值
int right=nums.size()-1; //右界赋值
while(left<=right)
{
int mid=left+(right-left)/2; //寻找中间值
if(nums[mid]>=target) //中间值大于目标值
{
right=mid-1; //重新对右界赋值
}
else
{
left=mid+1; //重新对左界赋值
}
}
return left; //返回左值
}
int highBorder(vector<int> &nums, int target) //查找结束位置
{
int left = 0; //左界为0
int right = nums.size() - 1; //右界赋值
while (left <= right)
{
int mid = left + (right - left) / 2; //中间位置赋值
if (nums[mid] > target) //如果中间位置大于目标值
{
right = mid - 1; //重新对右界赋值
}
else
{
left = mid + 1; //否则重新对左界赋值
}
}
return right; //返回右界值
}
public:
vector<int> searchRange(vector<int> &nums, int target)
{
// 答案数组
vector<int> ans;
// 排除脏数据
if (nums.size() == 0)
{
// 初始化就是0
return {-1, -1};
}
int low = lowBorder(nums, target);
int high = highBorder(nums, target);
if (low > high)
{
return {-1, -1};
}
return {low, high};
}