[二分法]leetcode34:在排序数组中查找元素的第一个和最后一个位置(medium)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43152052/article/details/100417571

题目:
在这里插入图片描述
题解:

class Solution {
public:
    //解法1:STL算法,时间复杂度为0(n),空间复杂度为O(1)
    vector<int> searchRange_1(vector<int>& nums, int target) {
        if(nums.empty())return {-1,-1};
        vector<int> result;
        auto it1=find(nums.begin(),nums.end(),target);//寻找第一个值为target的元素,获得指向该目标值的迭代器
        if(it1!=nums.end())result.push_back(it1-nums.begin());
        else return {-1,-1};
        auto it2=find(nums.rbegin(),nums.rend(),target);//寻找最后一个值为target的元素,获得指向该目标值的迭代器
        if(it2!=nums.rend())result.push_back(nums.rend()-it2-1);
        return result;
    }
    
    //解法2:二分查找,时间复杂度O(logn),空间复杂度为O(1)
    vector<int> searchRange_2(vector<int>& nums,int target)
    {
        if(nums.empty())return {-1,-1};
        vector<int> result;
        int left=0,right=nums.size()-1;
        while(left<right)//从左边寻找第一个值为target的元素的位置,找到时left=right
        {
            int mid=left+((right-left)>>1);
            if(nums[mid]>=target)right=mid;
            else left=mid+1;
        }
        
        if(nums[left]!=target)return {-1,-1};//没找到目标值
        result.push_back(left);//添加第一个值为target的元素下标
        right=nums.size()-1;//重置right
        
        while(left<right)//从右边寻找第一个值为target的元素的下标,找到是left=right
        {
            int mid=((right+left+1)>>1);//将mid的值加1/2,每次中间值落在右边
            if(nums[mid]<=target)left=mid;
            else right=mid-1;
        }
        result.push_back(right);
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/100417571