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

题目链接:34. 在排序数组中查找元素的第一个和最后一个位置。

在这里我们可以用暴力的解法:就是一次判断,第一次遇见的元素==target,和最后一次遇见的,就保存起来

但是这样暴力解法时间复杂度为O(N)。时间复杂度超出了题目意思。

优化解法:因为数组是有序的,我们可以根据二分查找思想来进行解决,

利用二短性来进行,左右分段来查询边界

思路画图所示:

cpp 复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left1 = 0, left2 = 0, right1 = nums.size() - 1, right2 = nums.size() - 1;
        if (right1 < 0) return { -1,-1 }; //当是空数组时,right会小于0,这时直接退出就行
        while (left1 < right1)//不能等于,如果等于就会,一直right1 = mid1死循环
        {
            int mid1 = left1 + (right1 - left1) / 2;//优先左取整
            if (nums[mid1] < target) left1 = mid1 + 1;
            else if (nums[mid1] >= target) right1 = mid1;
        }
        while (left2 < right2)
        {
            int mid2 = left2 + (right2 - left2 + 1) / 2;//优先右取整
            if (nums[mid2] <= target) left2 = mid2;
            else if (nums[mid2] > target) right2 = mid2 - 1;
        }
        if (nums[right1] != target && nums[left2] != target) return { -1,-1 };//最后判断所处位置如果不是target,肯定不存在,直接返回
        return { right1,left2 };
    }
};
相关推荐
蛋蛋的就会顺顺的8 分钟前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙15 分钟前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
小小龙学IT1 小时前
snap7 开源西门子 S7 通信协议库深度解析
c++·开源
zhangfeng11331 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY1 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
小溪学编程1 小时前
从 C++ 的规范变迁看语言发展
jvm·c++·面试
白帽攻防录2 小时前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
小O的算法实验室2 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
ShineWinsu2 小时前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string
字节跳动的猫3 小时前
LikeShop 积分体系全链路改造:获取规则、订单抵扣与积分商品兑换二开
运维·数据结构