| 78 | """ |
| 79 | |
| 80 | class Solution(object): |
| 81 | def find_right(self, nums, target): |
| 82 | lo = 0 |
| 83 | hi = len(nums) |
| 84 | equals = [] |
| 85 | while lo < hi: |
| 86 | mid = (lo + hi) // 2 |
| 87 | if target == nums[mid]: |
| 88 | equals.append(mid) |
| 89 | |
| 90 | if target < nums[mid]: |
| 91 | hi = mid |
| 92 | else: |
| 93 | lo = mid + 1 |
| 94 | |
| 95 | return equals[-1] if equals else -1 |
| 96 | |
| 97 | def find_left(self, nums, target): |
| 98 | lo = 0 |
| 99 | hi = len(nums) |
| 100 | equals = [] |
| 101 | while lo < hi: |
| 102 | mid = (lo + hi) // 2 |
| 103 | if target == nums[mid]: |
| 104 | equals.append(mid) |
| 105 | |
| 106 | if target > nums[mid]: |
| 107 | lo = mid + 1 |
| 108 | else: |
| 109 | hi = mid |
| 110 | return equals[-1] if equals else -1 |
| 111 | |
| 112 | |
| 113 | def searchRange(self, nums, target): |
| 114 | """ |
| 115 | :type nums: List[int] |
| 116 | :type target: int |
| 117 | :rtype: List[int] |
| 118 | """ |
| 119 | |
| 120 | left = self.find_left(nums, target) |
| 121 | if left == -1: |
| 122 | return [-1, -1] |
| 123 | |
| 124 | return [left, self.find_right(nums, target)] |
nothing calls this directly
no outgoing calls
no test coverage detected