34-排序数组中查找元素的第一个和最后一个下标

 看到时间复杂度要求:O(logn),就知道是折半查找,很简单,先折半查找target的下标,之后向左右找nums[left],nums[right]等于target的下标,返回就行。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int mid=findHalf(nums,target);//找target的下标(只是其中一个下标)
        if(mid==-1)return new int[]{-1,-1};
        int left=mid;//左边界下标
        int right=mid;//右边界下标
        while(left>0)
        {
            if(nums[left-1]==target)
            {
                left--;
            }
            else
            {
                break;
            }
        }
        while(right<nums.length-1)//因为要涉及到下标right+1,所以,right只能到nums.length-1
        {
            if(nums[right+1]==target)
            {
                right++;
            }
            else
            {
                break;
            }
        }
        return new int[]{left,right};

    }
    public int findHalf(int[] nums,int target)
    {
        int left=0;
        int right=nums.length-1;
        
        while(left<=right)
        {
            int mid=(left+right)/2;
            if(nums[mid]==target) return mid;
            else if(nums[mid]<target)
            {
                left=mid+1;
            }
            else{
                right=mid-1;
            }
        }
        return -1;
    }
}

  

原文地址:https://www.cnblogs.com/lzh1043060917/p/12791978.html