Problem Definition:
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]
.
Solution:
有序数组,二分查找。这里要查找的是一个范围,[start-->end]。
当进行二分查找时,会找到很多个[start-->end],应该合并为一个大的范围。即要找到最大的end和最小的start。
1 # @param {integer[]} nums 2 # @param {integer} target 3 # @return {integer[]} 4 def searchRange(self, nums, target): 5 rg=[2147483647, -1] 6 self.recur(nums, target, 0, len(nums)-1, rg) 7 if rg[0]==2147483647: 8 rg[0]=-1 9 return rg 10 11 def recur(self, nums, target,start, end, rg): 12 if nums[start]>target or nums[end]<target: 13 return 14 if start==end: #only one element 15 if nums[start]==target: 16 rg[0]=min(rg[0], start) 17 rg[1]=max(rg[1], end) 18 else: 19 mid=(start+end)/2 20 if nums[mid]>target: 21 self.recur(nums, target, start, mid, rg) 22 elif nums[mid]<target: 23 self.recur(nums, target, mid+1, end, rg) 24 else: 25 self.recur(nums, target, start, mid, rg) 26 self.recur(nums, target, mid+1, end, rg)
解释:
1)用一个二元的数组rg来存放起止点的下标。
2)如果一个子数组,它起始的元素就已经比目标target要大,或者它的终止位置比target要小,就直接退出当前的查找了。
3)如果数组中间位置刚好等于target,则应该往左右两部分分别继续去查找。