34.在排序数组中查找元素的起始和末尾位置

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
找不到输出[-1,-1]

先找到第一个nums[mid]=target的mid,然后分别查找左右。
当时觉得还不错,一运行时间和线性查找差不多。

class Solution {
    
    
    public int[] searchRange(int[] nums, int target) {
    
    
        int left=0;
        int right=nums.length-1;
        int begin=left;
        int end=right;
        while (left<=right){
    
    
            int mid=left+(right-left)/2;
            if(nums[mid]==target){
    
    
                if(mid-1>=0&&target>nums[mid-1]) begin=mid;
                else begin=search(nums,target,left,mid-1,begin,0);

                if(mid+1<nums.length&&target<nums[mid+1]) end=mid;
                else end=search(nums,target,mid+1,right,end,1);
                return new int[]{
    
    begin,end};
            }
            if(nums[mid]>target) right=mid-1;
            else left=mid+1;
        }
        return new int[]{
    
    -1,-1};
    }
    private int search(int[] nums,int target,int left,int right,int tep,int f){
    
    
        if(left>right) return tep;

        while (left<=right){
    
    
            int mid=left+(right-left)/2;
            if(nums[mid]==target){
    
    
                int te=search(nums,target,left,mid-1,mid,0);
                int ta=search(nums,target,mid+1,right,mid,1);
                if(f==0){
    
    
                    return Math.min(te,ta);
                }else{
    
    
                    return Math.max(ta,te);
                }
            }
            if(nums[mid]>target) right=mid-1;
            else left=mid+1;
        }
        return tep;
    }
}

下面这段代码十分的简介。二分,如果相等,那么看需求区间左移还是右移。

class Solution {
    
    
    public int[] searchRange(int[] nums, int target) {
    
    
       int begin=findLeft(nums,target);
       int end=findRight(nums,target);
       return new int[]{
    
    begin,end};
    }

    private int findRight(int[] nums, int target) {
    
    
        int ans=-1;
        int left=0;
        int right=nums.length-1;
        while (left<=right){
    
    
            int mid=left+((right-left)>>1);
            if(nums[mid]==target){
    
    
                ans=mid;
                left=mid+1;
            }else if(nums[mid]>target){
    
    
                right=mid-1;
            }else{
    
    
                left=mid+1;
            }
        }
        return ans;
    }

    private int findLeft(int[] nums,int target){
    
    
        int ans=-1;
        int left=0;
        int right=nums.length-1;
        while (left<=right){
    
    
            int mid=left+((right-left)>>1);
            if(nums[mid]==target){
    
    
                ans=mid;
                right=mid-1;
            }else if(nums[mid]>target){
    
    
                right=mid-1;
            }else{
    
    
                left=mid+1;
            }
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43179428/article/details/107138523