### 34. Search for a Range



题目：

 https://leetcode.com/problems/search-for-a-range/



难度 : Medium



思路：

二分法，先找```target```出现的左边界，判断是否有```target```后再判断右边界

- 找左边界：二分，找到一个```index```
    - 该```index```对应的值为```target```  
    - 并且它左边```index-1```对应的值不是```target```（如果```index```为```0```则不需要判断此条件）
    - 如果存在```index```就将其```append```到```res```中
- 判断此时```res```是否为空，如果为空，说明压根不存在```target```，返回```[-1, -1]```
- 找右边界：二分，找到一个```index```（但是此时用于二分循环的```l```可以保持不变，```r```重置为```len(nums)-1```，这样程序可以更快一些）
    - 该```index```对应的值为```target```
    - 并且它右边```index+1```对应的值不是```target```（如果```index```为```len(nums)-1```则不需要判断此条件）   
    - 如果存在```index```就将其```append```到```res```中



AC 代码




```python
class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        if not nums : return [-1, -1]

        res = []
        l, r = 0, len(nums)-1
        # search for left bound
        while l <= r:
            mid = l + ((r - l) >> 2)
            if nums[mid] == target and (mid == 0 or nums[mid-1] != target):
                res.append(mid)
                break
            if nums[mid] < target:
                l = mid + 1
            else:
                r = mid - 1
        if not res:
            return [-1, -1]
        # search for right bound
        r = len(nums)-1
        while l <= r:
            mid = l + ((r - l) >> 2)
            if nums[mid] == target and (mid == len(nums)-1 or nums[mid+1] != target):
                res.append(mid)
                break
            if nums[mid] > target:
                r = mid - 1
            else:
                l = mid + 1       
        return res
```





