QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2602|回复: 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. 在排序数组中查找元素的第一个和最后一个位置
    7 V" Z) R9 l& ]3 @7 s. a% s7 b- B* ^难度中等
    ) ]  u1 j# Y" \$ ^( p6 d给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。# P: B  V  L1 c& E
    如果数组中不存在目标值 target,返回 [-1, -1]。7 ]5 W+ f7 Y+ \" O
    你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。9 V+ |) K2 j: E2 Z1 T. z
    & c8 |" n' z9 h) c9 _9 ~3 ]
    示例 1:
    2 F) p7 h( B( X* S输入:nums = [5,7,7,8,8,10], target = 8
    9 \/ h# m& b, K/ T/ L: u输出:[3,4]$ I0 R5 e! C; m/ t
    示例 2:0 n6 `( M% @5 d% g+ S  h
    输入:nums = [5,7,7,8,8,10], target = 6* c9 q5 i0 H4 Q; f, j9 z6 ^
    输出:[-1,-1]
    9 n  p% r% b. B% X) D示例 3:
    * |5 D6 c: D) X输入:nums = [], target = 0& s8 F, |! q( D. t+ Y
    输出:[-1,-1]
    5 V0 R& o  s: M" H( l1
    3 Z' n9 Y9 c" n! R2/ l  ]" I2 ^) L! p
    3
    9 P* f" X( ?6 d! M) I" N- T" h' S4$ U8 ?" t) H3 o+ M+ s' i
    54 M6 h$ V) U, _: f* m
    6
    1 F. I6 W7 @4 p. C7. D. l( p  D0 R' N! m4 a2 a
    8; ]. V8 j4 `5 O6 ~2 d( z& q0 W0 K
    97 N) C) G; ~0 A: f7 ]5 T2 ~1 k
    提示:# s( e4 @; Z6 @1 L$ Q6 F8 t% t' H
    * p/ Y0 P  Z  C" p/ V: |  c
    0 <= nums.length <= 10(5)
    # `/ Y/ h& C( m5 T: N; ~-10(9) <= nums[i] <= 10(9)
    " s! ]5 ~" k- o4 f6 P5 Xnums 是一个非递减数组
    - C2 g7 \8 }8 j-10(9) <= target <= 10(9)  y5 y" S' J; @! S8 I+ V2 [
    思路
    # d3 T! E* B! C# u' A% [3 d关键步骤,与二分查找不同: e! i% x- x9 m' p* ~% B, t
    if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
    * ^' e4 L+ f9 f0 M9 C- q" itarget==nums[mid]时,不结束循环,继续进入
    ; `3 u! Q% A" C/ O两个if可以同时进入,寻找界限% z+ H; X5 d; f) ]$ D
    设置限制,防止mid-1,mid+1越界5 S+ N( M& l5 W2 q0 \
    代码
    9 G, R+ u7 u7 ]; D- p6 {8 n3 rclass Solution {- l! _: }/ {, ]2 v
    public:( f- L/ b/ X4 R8 S, Q) ~
        int left=-1,right=-1;- A* G6 r" G. I- c- e
        vector<int> searchRange(vector<int>& nums, int target) {
    & t4 V3 m7 R- ?  H: R        if(nums.size()==0)  return vector<int>{-1,-1};
    . G2 N: E* W) {2 q: O        binary_search(nums,target,0,nums.size());3 P5 R* R2 M% h: z3 C
            return vector<int>{left,right};
    , o& Z$ c( B, x+ u8 B# u    }/ Y6 J0 A& }  x: ~
        void binary_search(vector<int>& nums,int target,int l ,int r){
    ! P6 z% o5 z( l' v' a' D; i( I' F        int mid=(r-l)/2+l;
    : b1 {7 x1 {* O9 [        //printf("%d-%d\n",l,r);
    2 d2 \( X1 f3 N6 ]! g2 Q' b        if(target==nums[mid]){  x1 p( e8 R1 G! G
                if(left>mid||left<0)  left=mid;1 [: n: _- S% e5 Z- W- O
                if(right<mid||right<0)   right=mid;% R1 M, c  F0 N/ q
            }
    ! v- M/ l* C5 a. z8 Q9 P7 _7 J        if(l>=r) return;: X2 [- j) W) C( z( c% E) A9 o: L
            if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);
    # H1 `. g1 i& C; M5 t2 s# c: B        if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);
    " U/ v& B# ^2 D! ?& ]  K. }9 y8 V    }
    - o+ ?4 V: q# i* A, Y% m};- I. b7 \) b( L5 R9 C) R
      }, d; F; D7 I7 L9 u4 t
    ————————————————
      p5 Q2 m0 o( I& C! {版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      P# V6 W3 Y* F- Z' G, c/ r0 i$ ^原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832. C1 R( x$ q3 }5 Q7 i6 n. f. }( G

    - F/ i* K! i5 x6 F- B9 m0 e1 {& R0 u
    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-13 08:23 , Processed in 0.550900 second(s), 51 queries .

    回顶部