Still we have slick solution:
try:
return [nums.index(target), len(nums) - 1 - nums[::-1].index(target)]
except:
return [-1, -1]
Run Time is 84 ms.
Or we can use binary search, just like last problem. Below is a solution with 3 binary search methods.
Solution:
# T:O(lgn) S:O(1)
class Solution:
# @param A, a list of integers
# @param target, an integer to be searched
# @return a list of length 2, [index1, index2]
def searchRange(self, A, target):
# Find the first index where target <= A[idx]
left = self.binarySearch(lambda x, y: x <= y, A, target)
if left >= len(A) or A[left] != target:
return [-1, -1]
# Find the first index where target < A[idx]
right = self.binarySearch(lambda x, y: x < y, A, target)
return [left, right - 1]
def binarySearch(self, compare, A, target):
start, end = 0, len(A)
while start < end:
mid = start + (end - start) / 2
if compare(target, A[mid]):
end = mid
else:
start = mid + 1
return start
def binarySearch2(self, compare, A, target):
start, end = 0, len(A) - 1
while start <= end:
mid = start + (end - start) / 2
if compare(target, A[mid]):
end = mid - 1
else:
start = mid + 1
return start
def binarySearch3(self, compare, A, target):
start, end = -1, len(A)
while end - start > 1:
mid = start + (end - start) / 2
if compare(target, A[mid]):
end = mid
else:
start = mid
return end
Run Time: 52 ms
No comments:
Post a Comment