QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2679|回复: 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. 在排序数组中查找元素的第一个和最后一个位置
    % D! E- E6 j$ l8 h难度中等$ o5 T4 P9 Z: F6 q
    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
      U+ O8 }8 V) v; s如果数组中不存在目标值 target,返回 [-1, -1]。% `& Z5 ~2 @% C. [0 A
    你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
    # Z0 t9 Y0 P8 }+ L/ ?! E  {" T* U+ N) b& T7 o' [- d
    示例 1:4 }8 G- W. g! v) f
    输入:nums = [5,7,7,8,8,10], target = 8
    0 ]$ |& {9 t- {6 k) A3 c, T输出:[3,4]/ B6 P$ U" v* P
    示例 2:& y( \4 I4 g1 v% d5 D% e5 s
    输入:nums = [5,7,7,8,8,10], target = 6
    ( X1 V  n& R9 D( M2 {: s" Z3 Z输出:[-1,-1]6 s( m5 l; A3 c7 ~: f# O
    示例 3:) P9 {9 a. K. O6 A
    输入:nums = [], target = 02 Q: k& W4 z; z  }0 B
    输出:[-1,-1]2 k8 j$ A$ P- y  u$ ^6 i* y
    1
    " v. ^+ y6 d1 K4 r1 n( u2 U2
    ( I1 ^% p" r5 W7 G4 Q8 M  G. o$ G3
    # g9 J- G/ |" z+ x( G44 x+ P% q$ u# A& h* s% F3 V6 g5 E4 f
    5
    1 j: n, S+ ]$ c( G6
    & x) C: {+ \; O7
      Y9 u7 _" R  h' ~: t* @87 u4 v" _6 s9 m  t
    9
    1 u. ^* V0 B2 C# \. h9 B/ B提示:
    0 @* U! u1 _; }: C8 t7 K1 c2 a
    . O% M0 P4 T3 G' B! }0 ~) U5 ]0 <= nums.length <= 10(5)4 y1 w& J" m. y) {* G
    -10(9) <= nums[i] <= 10(9)8 K3 t  x; n3 d% [
    nums 是一个非递减数组
    ' \. E$ ^$ `- z0 H1 r! `) l-10(9) <= target <= 10(9)
    9 p' h8 l% F) H/ j9 g* g# Z思路
    , C9 b& [. Y' i( |" {( z- y: X关键步骤,与二分查找不同2 U% G6 [5 g5 U) y! n$ g- C
    if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);0 d1 B7 `# I0 p+ [$ U0 B  c* P! ]
    target==nums[mid]时,不结束循环,继续进入/ f4 e9 g) ?: P
    两个if可以同时进入,寻找界限& i. e  h, Z1 }$ ~, `- ]$ I
    设置限制,防止mid-1,mid+1越界  W! A1 Z8 H2 X* q( O
    代码
    ; _; r. C2 i" @" [class Solution {
    . Z7 @/ c* d) V4 A6 lpublic:( J4 z& P0 {  M! v7 j
        int left=-1,right=-1;
    / o) ~# d$ T0 n4 {# w    vector<int> searchRange(vector<int>& nums, int target) {
    $ ~8 V' M( b5 @: C' P        if(nums.size()==0)  return vector<int>{-1,-1};
    ( Y; N, L/ p, R4 h- @+ P        binary_search(nums,target,0,nums.size());
    6 K1 A5 z2 s, h$ k8 a* c        return vector<int>{left,right};
    , l+ z* T5 A/ s& i+ P/ K& {    }( N0 |0 m4 o- s% P$ F
        void binary_search(vector<int>& nums,int target,int l ,int r){
    2 P8 k  h, A. `/ [        int mid=(r-l)/2+l;
    : W. y  ]  s. d4 a  U' m- i        //printf("%d-%d\n",l,r);
    . P$ f& ?  ~* h3 y+ [) N        if(target==nums[mid]){: ?1 S' ~0 g9 T- E
                if(left>mid||left<0)  left=mid;
    " I+ _, I2 M* ]2 F* i6 J3 L            if(right<mid||right<0)   right=mid;- U3 O- @& H2 W; h0 E: U- G7 C0 C
            }
    ' v4 Z3 v# m/ o1 X" V( k3 t        if(l>=r) return;
    3 J0 [/ ^3 m7 L        if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);3 n/ E7 L$ Z& Y, O% L
            if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);! R2 h1 w2 K$ M7 H& e: i
        }
    2 ?/ R' Q, N; e, t% _4 Z};
    4 Q  ~: L3 n" A& P! Y, O5 \
    + W' f: Q' A6 b% k9 L, c, w————————————————2 s/ `* }3 \! c. m; S
    版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      M4 w7 ?" D2 r! {8 C; x2 g9 O$ a* m原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488322 l$ H# z' Y2 q% o
    0 u$ G- {% i; ]  c7 z
    1 _1 C. p( q" C1 N
    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-8-24 04:58 , Processed in 0.579025 second(s), 51 queries .

    回顶部