算法练习: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 };
    }
};
相关推荐
2402_871321953 分钟前
Matlab与python数据处理对比
python·gpt·学习·算法·matlab
Adunn4 分钟前
算法基础 - 最小二乘法(线性拟合)
c++·人工智能·算法·机器学习·自动驾驶·最小二乘法
Re.不晚11 分钟前
Java图书管理系统(简易&保姆级)
java·linux·服务器·开发语言·学习·算法·intellij-idea
笨蛋不要掉眼泪13 分钟前
泛型数组与hashmap
java·开发语言·算法
一念之坤21 分钟前
算法篇:贪心算法
java·算法·贪心算法
敲上瘾25 分钟前
虚拟地址空间与物理内存(Linux系统)
linux·运维·服务器·开发语言·c++·算法·aigc
一位小说男主27 分钟前
深度学习中的梯度下降算法:详解与实践
人工智能·深度学习·神经网络·算法
醉颜凉31 分钟前
【NOIP普及组】表达式求值
c语言·开发语言·c++·算法
嵌入式系统工程师1 小时前
11.25c++继承、多态
开发语言·c++
Smile丶凉轩1 小时前
微服务即时通讯系统的实现(服务端)----(2)
c++·vscode·微服务·架构·xcode