题目:
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]
.
二分法求解。找到最左与最右边界值既可。注意寻找最左与最有边界的函数(<=以及判等问题)
python版本:
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
def lsearch(nums,target):
lo,hi,mid = 0,len(nums)-1,-1
while(lo<=hi):
mid = (lo+hi)/2
if(nums[mid]<target):
lo = mid+1
else:
hi = mid-1
if(lo in range(len(nums)) and nums[lo]==target):
return lo
return -1
def rsearch(nums,target):
lo,hi,mid = 0,len(nums)-1,-1
while(lo<=hi):
mid = (lo+hi)/2
if(nums[mid]>target):
hi = mid-1
else:
lo = mid+1
if(hi in range(len(nums)) and nums[hi]==target):
return hi
return -1
lindex = lsearch(nums,target)
rindex = rsearch(nums,target)
return [lindex,rindex]
c++版本:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res;
int lindex = lsearch(nums,target);
int rindex = rsearch(nums,target);
res.push_back(lindex);
res.push_back(rindex);
return res;
}
int lsearch(vector<int>& nums, int target)
{
int lo=0;int hi=nums.size()-1;
int mid = -1;
while(lo<=hi)
{
mid = (lo+hi)>>1;
if(nums[mid]<target)
lo = mid+1;
else
hi = mid-1;
}
if(nums[lo]==target)return lo;
return -1;
}
int rsearch(vector<int>& nums, int target)
{
int lo=0;int hi=nums.size()-1;
int mid = -1;
while(lo<=hi)
{
mid = (lo+hi)>>1;
if(nums[mid]>target)
hi = mid-1;
else
lo = mid+1;
}
if(nums[hi]==target)return hi;
return -1;
}