QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2610|回复: 0
打印 上一主题 下一主题

[其他资源] 34. 在排序数组中查找元素的第一个和最后一个位置

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-5 16:45 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    34. 在排序数组中查找元素的第一个和最后一个位置
    8 |, i& K; u% D' }* N3 P( G难度中等
    9 y- {5 @5 w9 J5 ^给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
    1 I: q# y# ]4 |. W如果数组中不存在目标值 target,返回 [-1, -1]。
    " G* f$ h. Q) O+ y' `& _你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
    * f. q+ H; E# R- I7 c2 `. D/ ?9 `* ^
    示例 1:# F/ @: b9 B, e( C, A* |
    输入:nums = [5,7,7,8,8,10], target = 89 Y4 U( J5 b& l5 |
    输出:[3,4]
    * ^  `2 ^, z1 _5 a示例 2:) a3 t! s! m( @
    输入:nums = [5,7,7,8,8,10], target = 61 i7 y+ g$ ^8 Q' x( o
    输出:[-1,-1]& Y' x7 m) H  X- e
    示例 3:9 j# e( Z' g5 m! d
    输入:nums = [], target = 09 D) y  v! D! {2 Q, Q* Y4 c6 j+ i
    输出:[-1,-1]
    9 T1 R9 [) p* R/ c6 w4 u; K8 x" j$ S1/ ]* p) E& L2 L" A1 E
    2
    7 D0 ]+ @5 r  V, E3 H7 ~/ @3
    9 h! e) Y, n* A: k  m+ l- @5 ?4
    3 F( f; @0 G2 n5
    ; p, l% X  G. L8 ]) P6
    - I$ T% E4 d" g, h74 W" h8 I, x, X! e5 d
    8
    2 F% e2 h2 y; s$ [1 V$ `* z, F9
    ) c3 L5 A6 u5 }/ Q提示:
    2 y( ~/ p$ Y, o0 Y( [! H# a0 M* ^- i3 e+ l) E
    0 <= nums.length <= 10(5)
    # u5 @$ t5 u1 ~9 \8 c" V-10(9) <= nums[i] <= 10(9); Q! r- j2 U" ^+ T1 r5 w
    nums 是一个非递减数组' y- D) w* }( S8 V3 a
    -10(9) <= target <= 10(9)
    , R7 P+ @/ D* d: C. j思路" n; T* Z7 Y! [# c
    关键步骤,与二分查找不同8 i! O/ w, J& T$ I" {6 z
    if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
    # J6 B$ w  ~- z& Gtarget==nums[mid]时,不结束循环,继续进入
    ( o5 `6 ?" S% x7 Z+ H( T, Z两个if可以同时进入,寻找界限
    ' r3 Q' d0 R( v1 D! `5 @设置限制,防止mid-1,mid+1越界
    / }9 Y' B7 T/ [8 a3 w3 B代码8 Y, t  q: k4 C% J. S
    class Solution {) c( ^' `  s$ l% V/ y7 o" ]8 l
    public:
    $ V# p& c6 L- z3 w1 d2 s    int left=-1,right=-1;
    & t, S( U  R- D5 v    vector<int> searchRange(vector<int>& nums, int target) {0 S& I/ f. q$ \* y  U& B9 U1 g
            if(nums.size()==0)  return vector<int>{-1,-1};: H& a; z! {6 n6 d$ E; f+ e8 p
            binary_search(nums,target,0,nums.size());  f, m( \+ j  `7 ~% E3 Q9 K
            return vector<int>{left,right};
    ( b0 ?) Z" f3 n; x  T& W0 s1 k    }
    ; _" `3 w0 L+ F    void binary_search(vector<int>& nums,int target,int l ,int r){
    ) R& v5 @$ U: w- M        int mid=(r-l)/2+l;
    % N5 s  H. f0 u3 D8 J5 i, K        //printf("%d-%d\n",l,r);0 p+ M% {9 E* Y: Y7 W
            if(target==nums[mid]){: }  ?: h5 A. ^2 P" N+ N
                if(left>mid||left<0)  left=mid;/ B6 P) j+ O+ i. a
                if(right<mid||right<0)   right=mid;9 w. S+ F  R/ N% Q
            }0 Y' R' J8 p& ]. u4 |* C/ V
            if(l>=r) return;
    7 u- i9 t6 q  v3 ~. F  V$ E8 g        if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);
    * I/ i) t6 T' s* z        if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);
    $ n! l, s$ i$ l* ?1 ~    }. M* X9 G+ Z6 P# J& a" E0 C# K
    };( {( ~8 E5 y/ d- W' @% q

    + g! M' Z! D  P5 b. |————————————————9 c7 e7 ]! X& k- X$ B
    版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 _, \+ @& j: f原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488326 C3 h# Z- K' U8 P5 w8 ]
    7 _, {: P8 H7 }; P& c' e

    % o- A4 }1 G! ^& u4 D
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-21 04:51 , Processed in 0.818649 second(s), 51 queries .

    回顶部