LeetCode--34.在排序数组中查找元素第一个和最后一个位置(二分法)

在排序数组中查找元素第一个和最后一个位置(C++)

1. 题目描述

难度:中等
在这里插入图片描述

2. 题目分析

看到题目我们需要知道以下几点:

  • 数组是有序的
  • 数组中存在重复的元素
  • 算法时间复杂度必须是O(logn)级别
  • 目标元素可能不存在与数组中

根据题目要求,算法复杂度必须是O(logn)级别,那么二分法就是最佳的算法。根据本题,我们要寻找的是目标元素在数组的起始位置和结束位置,我们可以根据二分法先搜索目标元素的起始位置,然后以该起始位置为起点,在搜索结束位置即可时间复杂度为O(logn)

3. C++语言实现

代码如下:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res(2,-1);
        // 如果数组为空,直接返回[-1,-1]
        if(nums.empty()) return res;
        // 初始化变量
        int n=nums.size(),l=0,r=n-1;
        // 循环条件是左下标<右下标
        while(l<r){
            int m=l+(r-l)/2;
            if(nums[m]>=target) r=m;
            else l=m+1;
        }
        // 如果nums[l]!=target,说明目标不存在,返回[-1,-1]
        if(nums[l]!=target) return res;
        // 否则l即目标元素的起始位置
        res[0]=l;
        // 寻找右节点
        r=n;
        while(l<r){
            int m=l+(r-l)/2;
            if(nums[m]<=target) l=m+1;
            else r=m;
        }
        res[1]=l-1;
        return res;
    }
};

运行结果为:
在这里插入图片描述

发布了163 篇原创文章 · 获赞 188 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/104732730