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

在这里插入图片描述
方法一:二分法

两次二分法

class Solution {
private:
    int first(vector<int>& nums, int target){   //寻找起始位置
        int left=0,right=nums.size()-1;
        while(left<right){
            int mid=(left+right)>>1;
            if(nums[mid]<target)    //[mid + 1, right]
                left=mid+1;
            else
                right=mid;
        }
        if(nums[left]==target)
            return left;
        return -1;
    }

    int last(vector<int>& nums, int target){    //寻找结束位置
        int left=0,right=nums.size()-1;
        while(left<right){
            int mid=(left+right+1)>>1;
            if(nums[mid]>target)    //[left,mid-1]
                right=mid-1;
            else
                left=mid;
        }
        return left;
    }

public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.empty())
            return {-1,-1};
        int l=first(nums,target);
        if(l==-1)
            return {-1,-1};
        int r=last(nums,target);
        return {l,r};
    }
};
发布了143 篇原创文章 · 获赞 0 · 访问量 1668

猜你喜欢

转载自blog.csdn.net/qq_43604517/article/details/104599409