首页 > 其他分享 >34. 在排序数组中查找元素的第一个和最后一个位置

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

时间:2023-06-26 15:55:44浏览次数:43  
标签:begin vector target nums int mid 34 查找 排序

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

 

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

二分法

二分查找为什么总是写错?

蓝色标记左边区域,浅蓝色边框代表元素尚未着色,蓝色边框代表元素已经着色; 红色标记右边区域,浅红色边框代表元素尚未着色,红色边框代表元素已经着色;

二分查找起始状态:

Screen Shot 2021-08-30 at 3.35.42 PM.png

代码


class Solution {
public:
    int searchleft(vector<int>& nums, int target) {
        int l = -1;
        int r = nums.size();
        while(l + 1 != r){
            int mid = l + (r - l)/2;
            if(nums[mid] >= target){
                r = mid;
            }
            else{
                l = mid;
            }
        }
        return r;
    }
    int searchright(vector<int>& nums, int target) {
        int l = -1;
        int r = nums.size();
        while(l + 1 != r){
            int mid = l + (r - l)/2;
            if(nums[mid] <= target){
                l = mid;
            }
            else{
                r = mid;
            }
        }
        return l;
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        int leftdex = searchleft(nums,target);
        int rightdex = searchright(nums,target);
        if(leftdex <= rightdex && rightdex < nums.size() && nums[leftdex] == target && nums[rightdex] == target){
            return { leftdex , rightdex};
        }
        else{
            return { -1 , -1};
        }
    }
};

库函数


class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if (nums.empty()) {
            return {-1, -1};
        }
        int leftIdx = lower_bound(nums.begin(), nums.end(), target)-nums.begin();
        int rightIdx = upper_bound(nums.begin(), nums.end(), target)-1-nums.begin();
        if(leftIdx<=rightIdx && rightIdx<nums.size() && nums[leftIdx]==target && nums[rightIdx]==target) {
            return {leftIdx, rightIdx};
        }
        return {-1, -1};
    }
};

标签:begin,vector,target,nums,int,mid,34,查找,排序
From: https://www.cnblogs.com/lihaoxiang/p/17505842.html

相关文章

  • i5/i7该选谁?差距大不大?i5-13490F、i7-13790F深度测试
    一、i5、i7还是性能差不多吗?自从2017年Zen架构发布开始,Intel与AMD在CPU性能竞争上就进入了激烈的内卷。随着双方在产品竞争上日趋白热化,同世代不同档次CPU产品的性能差距被明显拉大。那么,过去那种“i5、i7性能差不多,用i5性价比比较高”的观点是否依然成立?今天就带来Intel i5-13490......
  • 28.希尔排序
    插入排序虽好,但是某些特殊情况也有很多缺点,比如像下面这种情况:169前的元素基本不用插入操作就已经有序,元素1和2的排序几乎要移动数组前面的所有元素!!!于是,有个老帅哥就提出了优化此问题的希尔排序!希尔排序是希尔(DonaldShell)于1959年提出的一种排序算法。希尔排序也是......
  • LLM-Blender:大语言模型排序融合框架
    随着Alpaca,Vicuna,Baize,Koala等诸多大型语言模型的问世,研究人员发现虽然一些模型比如Vicuna的整体的平均表现最优,但是针对每个单独的输入,其最优模型的分布实际上是非常分散的,比如最好的Vicuna也只在20%的任务里比其他模型有优势。有没有可能通过集成学习来综合诸多开源的「......
  • vc6 配置使用 boost 1.34.1
    vc6配置使用boost1.34.1is2120于 2012-01-1314:17:05 发布2470 收藏分类专栏: c++ Boost 文章标签: python include library string 磁盘 cmd版权 c++同时被2个专栏收录61篇文章0订阅订阅专栏Boost8篇文章0订阅订阅专栏使用......
  • 27.插入排序
    自从上次小桂子发现了冒泡排序后,他开始相信自己的聪明才智比伴读小书童居然要高,所以他更加热衷于排序算法研究了,没事的时候,时不时找几个宫女演练一下,这时他又发现了一个新的排序方式,对于一下宫女们的队列:1.首先,我们只考虑第一个元素,从第一个元素171开始,该元素可以认为已经被排......
  • C++面试八股文:std::array如何实现编译器排序?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,st......
  • C++面试八股文:std::array如何实现编译器排序?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,std......
  • 26.冒泡排序
    每当皇帝选妃时,首席太监小桂子总是忍不住在旁边偷窥这些候选的美女,有一次他发现做为伴读小书童的你居然犯了个常人都可以轻易看出的错误,有几位候选的美女站成如下一排:当我们采用前面的选择排序时,我们仍然要将候选者遍历5遍,才能完成最终的排序,但其实,本身这些美女除了第一个外,已经......
  • 25.选择排序
    从前有个王国,国王骄奢无度,贪图女色,后宫佳丽三千,但还是动用大量财力物力在全国范围内招妃纳妾,浸淫于女色之中。又是一年的选妃开始,今年国王对身高比较敏感,要求这些候选者按照从低到高的顺序排列,供其选择。。。宫廷首席太监小桂子于是命令所有小公公把宫女的身高都量出来并上报到......
  • 面向过程概念 面向对象概念 类的定义和对象的产生 对象独有的数据 属性的查找顺序
    目录面向过程概念面向对象概念类的定义和对象的产生对象独有的数据属性的查找顺序面向过程概念面向过程(ProcedureOriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类......