Problem:
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
Analysis:
Solutions:
C++:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.empty() || target < nums[0] || target > *(nums.end() - 1))
return vector<int>(2, -1);
vector<int> range_ends;
int start = 0;
int end = nums.size() - 1;
while(start <= end) {
int mid = (start + end) / 2;
if(nums[mid] == target) {
int left = mid - 1;
for(; left >= 0; --left) {
if(nums[left] != nums[mid])
break;
}
range_ends.push_back(left + 1);
int right = mid + 1;
for(; right < nums.size(); ++right) {
if(nums[right] != nums[mid])
break;
}
range_ends.push_back(right - 1);
break;
} else if(nums[mid] < target)
for(start = mid + 1; nums[start] == nums[mid]; ++start) {}
else
for(end = mid - 1; nums[end] == nums[mid]; --end) {}
}
return range_ends.empty() ? vector<int>(2, -1) : range_ends;
}
Java
:
Python: