题目:
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
方法1、枚举
思路:通过正向枚举和反向枚举找到对应下标的位置
#include<iostream>
#include<vector>
using namespace std;
class Solution
{
vector<int> searchRange(vector<int>& nums,int target)
{
// 定义了2个整型元素的向量,且给出每个元素的初值为-1
vector<int> ans(2,-1);
int n =nums.size();
for(int i =0;i<n; i++)
{
if(nums[i] == target)
{
ans[0] = i;
break;
}
}
for(int j = n-1;j>=0;j--)
{
if(nums[j] == target)
{
ans[1] = j;
break;
}
}
return ans;
}
};
方法2、二分查找
思路:
找等于target的一个位置可以等价于求>= target的第一个位置
找等于target的最后一个位置可以等价于求 >= target+1的第一个位置 - 1
问题的难点就变成了如何快速找到大于等于target的第一个元素位置
class Solution
{
public:
// 闭区间:[left,right]
int lowBound(vector<int>& nums,int target)
{
int left = 0, right = nums.size()-1;
while(left<=right)
{
int mid = left + (right - left)/2;
if(nums[mid] < target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return left;
}
vector<int>searchRange(vector<int>& nums, int target)
{
// 左区间值
int start = lowBound(nums,target);
// 如果nums中没有target
if(start == nums.size() || nums[start] != target)
{
return {-1,-1};
}
// 右区间值
int end = lowBound(nums,target + 1)-1;
return {start,end};
}
};