QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2651|回复: 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. 在排序数组中查找元素的第一个和最后一个位置
    3 e/ {; V, S4 L1 O* \( y难度中等5 n% u( e+ _) l% x: @% Y5 c
    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
    # s" A. S! C8 n/ ]9 `! ~如果数组中不存在目标值 target,返回 [-1, -1]。
    2 C0 V9 A( f" C你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。" i7 d  Q# u6 R7 _

      e8 k; N* ^4 e8 _4 m( p示例 1:
    ) L! L0 m5 ~8 q" e: C' y输入:nums = [5,7,7,8,8,10], target = 8
    6 ]4 t8 J8 V5 p/ H- B2 I输出:[3,4]
    ) m9 o$ ]0 N4 @9 O示例 2:
    : P) A: g/ Z+ M0 c输入:nums = [5,7,7,8,8,10], target = 6
    ) y/ O+ @' e' H$ f( x% s% ]  m" a输出:[-1,-1]
    " A/ H# A$ J+ {9 {+ C示例 3:
      ~% {. B+ }- e- M" Y6 P/ y! z输入:nums = [], target = 09 ~& N' R, d4 I% P# P
    输出:[-1,-1]
    , _/ \8 I) ?+ S- R2 i7 P12 Y' H0 h, S5 b) t9 [
    2, k' @4 {- J$ l& T* o
    3
    * ]7 F/ R% F. s3 o/ B0 {% G4/ b, B6 A; {+ b& ?5 a$ L$ X7 ?8 ^
    5( U- V3 O' X3 m8 I) ^
    6& q: J2 F- h* v' X
    7) X& I% l+ Y/ u- A1 x! J" W
    81 k9 K2 R4 C9 ?( n. c, j* g! m
    9
    8 f  b1 `8 q% n; e8 ?) P提示:8 B' P( p7 u/ `& C/ `
    1 t3 B; d6 x4 Z& g& N0 M5 V
    0 <= nums.length <= 10(5)% w- Y* _# ]! ?% W- k
    -10(9) <= nums[i] <= 10(9)- U' Z3 r$ r) `3 X6 p' g
    nums 是一个非递减数组3 ~' y0 L5 ]% G; ^! S. S" A( l
    -10(9) <= target <= 10(9)3 q7 p0 C0 Y3 D! [4 Z8 Q
    思路- `) r) J2 m' U  j; `
    关键步骤,与二分查找不同7 d, D4 d) n1 o! p
    if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
    3 }: L0 Z1 q' ^) ^, d$ o4 Q9 E/ gtarget==nums[mid]时,不结束循环,继续进入
    6 d' J3 k' D" c两个if可以同时进入,寻找界限
    , k& I! S. _; b# x4 N% |) {$ i设置限制,防止mid-1,mid+1越界
    ( T# P) X9 C  F+ O6 b4 v代码7 T) _1 q# c, z8 z& i
    class Solution {  `, L7 m. |6 P- I
    public:
    5 L2 f/ w& V, h/ s' y  Q$ g; K+ L    int left=-1,right=-1;
    9 v! V% c5 m( X1 O' G+ h! e    vector<int> searchRange(vector<int>& nums, int target) {# C# `: Q& V  \1 \. @
            if(nums.size()==0)  return vector<int>{-1,-1};
    * p( T4 C6 ]3 y8 e6 f        binary_search(nums,target,0,nums.size());
    $ P+ u7 W7 [" o# o        return vector<int>{left,right};
    , \8 C' t* c1 u; b: j4 E3 v- [    }
    , ~5 c3 T- O7 H2 }    void binary_search(vector<int>& nums,int target,int l ,int r){
    - d, p8 S* }* F1 M; w. p        int mid=(r-l)/2+l;
    . E1 s% V" |- i5 p        //printf("%d-%d\n",l,r);
    4 t& I; O' u4 B        if(target==nums[mid]){
    ! x- X# F5 V! a5 |4 }2 ~            if(left>mid||left<0)  left=mid;
    ! n  U6 l& V. a; C            if(right<mid||right<0)   right=mid;
    9 O- ~& s! R+ F( C! Z  S        }
    ; `/ l) d. \" O4 H& U) P1 C; W        if(l>=r) return;/ R, C- i: i1 y4 K
            if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);
    6 {3 m  @. y/ }/ `6 w- Y+ D+ @* K        if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);
    3 |$ @$ y& q/ ~/ L7 |9 M    }
    6 v' B$ e- i. {0 V6 l& {};
    , g+ n& z$ R; f1 I& ]9 [) u  V! T3 ^- m5 r
    ————————————————
    6 y, X4 V5 s' K/ z' t3 }% |! k9 _版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 v0 n' x0 T+ u; F9 D8 j- s原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
    , `: n$ w8 S: j3 u7 c  Y% j4 q7 @0 N7 J, W6 ?1 b

    0 F0 X6 E, a: D8 A
    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-7-9 22:46 , Processed in 0.384685 second(s), 51 queries .

    回顶部