LeetCode Search for a Range

34. Search for a Range

Given an array of integers sorted in ascending order, 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].

方法

首先谨记一点时间复杂度为O(log n),只要是有限制的对log n,如2log n也属于O(log n)

这样这道题就很简单了,做两次二分查找即可,第一次查target的第一个数,第二次查target的最后一个数,两次查找分别写两个方法。

如下是网上大神写的方法,思路也是查找两次,但是有优化。首先,查找target的第一个数,若第一个数都不是target,直接返回。第二次,在第一个target数的位置上向后再做二分查找,找到target的最后一个数。

public class Solution {
    public int[] searchRange(int[] nums, int target) {
        if(nums.length == 0){
            return new int[]{-1,-1};
        }
        int start = 0;
        int end = nums.length-1;
        int[] res = new int[2];
        res[0] = -1;
        res[1] = -1;
        while(start < end){
            int mid = (start + end) / 2;
            if(nums[mid] < target){
                start = mid + 1;
            }else{
                end = mid;
            }
        }
        if(nums[start] != target){
            return res;
        }
        res[0] = start;
        end = nums.length-1;
        while(start < end){
            int mid = (start + end) / 2 + 1;
            if(nums[mid] > target){
                end = mid - 1;
            }else{
                start = mid;
            }
        }
        res[1] = end;
        return res;
    }

}
Share