【二分法] leetcode34:ソートされた配列は、最初と最後の位置(媒体)での要素を見つけます。

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: 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