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

1. 题意

给定一个非递减的数组,找出给定元素的开始位置和

结束位置。

2. 题解

题目要求复杂度为 log ⁡ ( n ) \log (n) log(n), 因此不能用双指针了。

这个题目练习二分挺好的。

2.1 双指针

还是把双指针的写下来吧。

cpp 复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {    
        int sz = static_cast<int>(nums.size());

        int bg = -1;
        int ed = -1;

        for (int i = 0; i < sz; i++) {
            if (bg == -1 && nums[i] == target)
                bg = i;
            if (target == nums[i])
                ed = i;
        }

        return vector<int>{bg, ed};
    }   
};

2.2 二分查找

lowerbound查找第一个,upper_bound查找最后一个的后面。

cpp 复制代码
class Solution {
public:
    int lbound(vector<int> &a, int target) {
        int l = -1;
        int r = static_cast<int>(a.size()) - 1;

        while (r - l > 0) {
            int mid = l + ((r - l + 1) >> 1);

            if (a[mid] < target)
                l = mid;
            else 
                r = mid - 1;
        }

        return r + 1;
    }
    int ubound(vector<int> &a, int target) {
        int l = -1;
        int r = static_cast<int>(a.size()) - 1;

        while ( r - l > 0) {
            int mid = l + ((r - l + 1) >> 1);

            if (a[mid] <= target)
                l = mid;
            else 
                r = mid - 1;
        }
        
        return r + 1;
    }


    vector<int> searchRange(vector<int>& nums, int target) {    
        
        auto bi = lower_bound( nums.begin(), nums.end(), target);

        if ( bi  == nums.end() || *bi > target)
            return vector<int>{ -1, -1};

        auto ui = upper_bound( nums.begin(), nums.end(), target);

        int bg = bi - nums.begin();
        int ed = ui - nums.begin();


        return vector<int>{bg, ed - 1};
    }   
};
相关推荐
Qhumaing42 分钟前
C++学习:【PTA】数据结构 7-1 实验7-1(最小生成树-Prim算法)
c++·学习·算法
踩坑记录2 小时前
leetcode hot100 3.无重复字符的最长子串 medium 滑动窗口(双指针)
python·leetcode
Z1Jxxx2 小时前
01序列01序列
开发语言·c++·算法
汽车仪器仪表相关领域4 小时前
全自动化精准检测,赋能高效年检——NHD-6108全自动远、近光检测仪项目实战分享
大数据·人工智能·功能测试·算法·安全·自动化·压力测试
Doro再努力4 小时前
【数据结构08】队列实现及练习
数据结构·算法
清铎6 小时前
leetcode_day12_滑动窗口_《绝境求生》
python·算法·leetcode·动态规划
linweidong6 小时前
嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
stm32·单片机·算法
踩坑记录6 小时前
leetcode hot100 42 接雨水 hard 双指针
leetcode
net3m336 小时前
单片机屏幕多级菜单系统之当前屏幕号+屏幕菜单当前深度 机制
c语言·c++·算法