题干

讲解

排序数组找一个值,自然而然就能想到二分查找;当然如果是直接循环也没问题,只不过时间复杂度是O(n),不符合题干要求;
题干中我们可以看到他要求O(log n)的时间复杂度,所以用的方法就是二分查找;

这里分享一下y总的整数二分查找的模板

注意第二种方法是 (l+r+1)/2

题解

public static int[] searchRange(int[] nums, int target) {
    if(nums.length == 0){
        return new int[]{-1,-1};
    }
    int left = check_left(nums, target);
    int right = check_right(nums, target);

    if(nums[left] != target){
        return new int[]{-1, -1};
    }else{
        return new int[]{left, right};
    }

}

/**
 * 查找第一个出现的位置
 * @param nums
 * @param target
 * @return
 */
public static int check_left(int[] nums, int target){

    int left = 0;
    int right = nums.length-1;

    while(left < right){
        int temp = (left+right)/2;
        if(nums[temp]>=target){
            right = temp;
        }else{
            left = temp+1;
        }
    }

    return left;
}

/**
 * 查找最后一个出现的位置
 * @param nums
 * @param target
 * @return
  */
public static int check_right(int[] nums, int target){

    int left = 0;
    int right = nums.length-1;

    while(left < right){
        int temp = (left+right+1)/2;
        if(nums[temp]<=target){
            left = temp;
        }else{
            right = temp-1;
        }
    }

    return left;
}