Search for a Range

Problem: Search for a Range

I use one binary search to find the target and use two pointers to find the range. A faster way is to use two binary search to find the left and right boundaries.

Code in Python:

class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(nums)
        l, r = 0, n-1
        while l <= r:
            mid = (l+r)/2
            if nums[mid] == target:
                i = j = mid
                while i > 0 and nums[i-1] == nums[i]: i -= 1
                while j < n-1 and nums[j+1] == nums[j]: j += 1
                return [i, j]
            elif nums[mid] < target:
                l = mid+1
            else:
                r = mid-1
        return [-1, -1]

Code in Java:

public class Solution {
    public int[] searchRange(int[] nums, int target) {

        int[] res = {-1, -1};

        if (nums.length == 0 || nums == null) {
            return res;
        }

        int l = 0, r = nums.length;
        int m;
        while (l < r) {
            m = (l+r)/2;
            if (nums[l] == target && (l == 0 || nums[l-1] < nums[l])) {
                res[0] = l;
                break;
            }
            if (nums[m] < target) {
                if (l == m) break;
                l = m;
            }
            else if (nums[m] > target) r = m;
            else {
                if (m == 0 || nums[m-1] < nums[m]) {
                    res[0] = m;
                    break;
                } else {
                    r = m;
                }
            }
        }
        if (res[0] == -1) return res;

        l = res[0]; r = nums.length; m = (l+r)/2;
        while (l < r) {
            m = (l+r)/2;
            if (nums[l] == target && (l == nums.length-1 || nums[l+1] > nums[l])) {
                res[1] = l;
                break;
            }
            if (nums[m] > target) r = m;
            else {
                if (m == nums.length-1 || nums[m+1] > nums[m]) {
                    res[1] = m;
                    break;
                } else {
                    l = m;
                }
            }
        }
        return res;
    }
}

results matching ""

    No results matching ""