LeetCode#34 Search for a Range

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,则应该往左右两部分分别继续去查找。

 

posted @ 2015-08-04 15:48  曾可爱  阅读(169)  评论(0编辑  收藏  举报