给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
样例
给出[5, 7, 7, 8, 8, 10]
和目标值target=8
,
返回[3, 4]
解法一(时间复杂度O(N))
class Solution {
public:
/*
* @param A: an integer sorted array
* @param target: an integer to be inserted
* @return: a list of length 2, [index1, index2]
*/
vector<int> searchRange(vector<int> &A, int target) {
// write your code here
int n=A.size();
int low=0,high=n-1;
vector<int>result(2);
result[0]=-1;
result[1]=-1;
while(low<n)
{
if(A[low++]==target)
{result[0]=low-1;
break;}
}
while(high>=0)
{
if(A[high--]==target)
{result[1]=high+1;
break;}
}
return result;
}
};
解法二(二分法)(时间复杂度O(N)
class Solution {
public:
/*
* @param A: an integer sorted array
* @param target: an integer to be inserted
* @return: a list of length 2, [index1, index2]
*/
vector<int> searchRange(vector<int> &A, int target) {
// write your code here
vector<int> ans;
int ansl = -1;
for (int l = 0, h = A.size() - 1; l <= h;)
{
int mid = l + (h - l) / 2;
if (A[mid] > target)
{
h = mid - 1;
}
if (A[mid] < target)
{
l = mid + 1;
}
if (A[mid] == target)
{
ansl = mid;
h = mid - 1;
}
}
int ansr = -1;
for (int l = 0, r = A.size() - 1; l <= h;)
{
int mid = l + (h - l) / 2;
if (A[mid] > target)
{
h = mid - 1;
}
if (A[mid] < target)
{
l = mid + 1;
}
if (A[mid] == target)
{
ansr = mid;
l = mid + 1;
}
}
ans.push_back(ansl);
ans.push_back(ansr);
return ans;
}
};