算法练习: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 };
    }
};
相关推荐
头发还没掉光光1 小时前
C++STL之list
c语言·数据结构·c++·list
我笑了OvO3 小时前
C++类和对象(1)
java·开发语言·c++·类和对象
virtual_k1smet4 小时前
#等价于e * d ≡ 1 mod φ(n) #模逆元详解
人工智能·算法·机器学习
可触的未来,发芽的智生4 小时前
新奇特:神经网络的集团作战思维,权重共享层的智慧
人工智能·python·神经网络·算法·架构
_屈臣_4 小时前
卡特兰数【模板】(四个公式模板)
c++·算法
渡我白衣5 小时前
C++ 异常处理全解析:从语法到设计哲学
开发语言·c++·面试
坚持编程的菜鸟5 小时前
LeetCode每日一题——交替合并字符串
c语言·算法·leetcode
青草地溪水旁5 小时前
设计模式(C++)详解——观察者模式(Observer)(1)
c++·观察者模式·设计模式
悦悦子a啊5 小时前
[Java]PTA: jmu-Java-02基本语法-08-ArrayList入门
java·开发语言·算法
xlq223226 小时前
12.排序(上)
数据结构·算法·排序算法