34. 在排序数组中查找元素的第一个和最后一个位置

 

  给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

 

  你的算法时间复杂度必须是 O(log n) 级别。

 

  如果数组中不存在目标值,返回 [-1, -1]。

 

  示例 1:

 

    输入: nums = [5,7,7,8,8,10], target = 8
    输出: [3,4]
  示例 2:

 

    输入: nums = [5,7,7,8,8,10], target = 6
    输出: [-1,-1]

 题解:

package array;

public class L34 {
    public static int[] searchRange(int[] nums, int target) {
        int index = searchIndex(nums,target,0,nums.length-1);
        int lowIndex = index,highIndex = index;
        if(lowIndex == -1 && highIndex == -1){
            return new int[]{lowIndex,highIndex};
        }
        while(lowIndex >= 0 && nums[lowIndex] == target){
            lowIndex --;
        }
        lowIndex++;
        while(highIndex<nums.length && nums[highIndex] == target){
            highIndex ++;
        }
        highIndex--;
        return new int[]{lowIndex,highIndex};
    }
    public static int searchIndex(int[] nums, int target,int start,int end){
        while(start <= end){
            if(nums[(start+end)/2] == target){
                return (start+end)/2;
            }else if(nums[(start+end)/2] > target){
                end = (start+end)/2-1;
                return searchIndex(nums, target,start,end);
            }else {
                start =  (start+end)/2+1;
                return searchIndex(nums, target,start,end);
            }
        }
        return -1;
    }

    public static void main(String[] args) {

        int[] nums = {1};
        int[] returnNums = searchRange(nums,1);
        System.out.println(returnNums[0]+"   "
                +returnNums[1]);
    }
}

 

原文地址:https://www.cnblogs.com/mayang2465/p/11736380.html