Tuesday, April 12, 2016

[LeetCode] 34. Search For A Range


Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
public class Solution {
    
    private int[] searchRangeAux(int[] nums, int target, int l, int r){
        int[] ret = new int[2];
        
        if(r - l == 1){
            if(target == nums[l]){
                ret[0] = l;
                ret[1] = r-1;
            }
            else{
                ret[0] = -1;
                ret[1] = -1;
            }
            return ret;
        }else if(r - l < 1){
            ret[0] = -1;
            ret[1] = -1;
            return ret;
        }
        
        int m = (l + r) / 2;
        if(nums[m] == target){
            int[] leftR = searchRangeAux(nums, target, l, m);
            int[] rightR = searchRangeAux(nums, target, m, r);
            
            // Error:  forgot to valid the return ...
            if(-1 == leftR[0]){
                ret[0] = rightR[0];    
            }
            else{
                ret[0] = leftR[0];
            }
            
            if(-1 == rightR[1]){
                ret[1] = leftR[1];
            }
            else{
                ret[1] = rightR[1];
            }
            return ret;
         }
         else if(nums[m] > target){
             return searchRangeAux(nums, target, l, m);
         }
         else{
            return searchRangeAux(nums, target, m, r);    
         }
    }
    
    public int[] searchRange(int[] nums, int target) {
        
        int len = nums.length;
        
        return searchRangeAux(nums, target, 0, len);
    }
}

No comments:

Post a Comment