Saturday, August 15, 2015

Leetcode 34. Search for a Range

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

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