QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2107|回复: 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. 在排序数组中查找元素的第一个和最后一个位置
    $ H  U' u- N7 {4 o: i难度中等
    % I. q# u! [8 ]' I给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。& V6 m5 k0 }7 j
    如果数组中不存在目标值 target,返回 [-1, -1]。
    6 C! b& R  f# p你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
    ' c0 z" C* P( S" E+ i1 U
    0 P! q- d& l% o$ @% i2 X示例 1:
    & a! A) }/ ]" u9 I. w& x输入:nums = [5,7,7,8,8,10], target = 8, T* u; O: B3 J$ _8 p% U; F
    输出:[3,4]
    " S- t; ?1 k6 \6 }' g0 ^示例 2:/ g8 G. F$ r: B7 J9 `  C3 F: S
    输入:nums = [5,7,7,8,8,10], target = 63 P. C( s( l# i- t% _
    输出:[-1,-1], }3 h( Y" a' y5 V, L; H
    示例 3:  z( p+ r' g5 @1 i. k2 ^
    输入:nums = [], target = 0( X  ~8 E( r, T& E( \1 K5 ~
    输出:[-1,-1]
    % c! @' d9 H8 J" k. `4 U! {- \1
    / |: l8 g0 x% }8 C20 M, c/ [! S$ `+ S$ ]$ \/ e
    3
    ' [8 D3 a# g$ e9 l! [0 k46 s( `1 S  U3 I2 h' {7 q6 B
    5; ]' a: X' J6 }2 {0 ~- p
    6
    2 j6 r" j6 |- e, J7
    3 {7 q, b4 q* q6 A& J# d8; @% H0 D6 ?( u$ P
    9" j/ Y0 M& `2 t& t
    提示:* }0 h& N' E5 v$ P4 f( o
    + z, |% m1 U5 n4 M/ T7 U' f
    0 <= nums.length <= 10(5)- R/ w0 a2 |+ u+ [) i
    -10(9) <= nums[i] <= 10(9)
    - G1 v4 p2 z* ^% a7 H; Knums 是一个非递减数组' [1 F, K8 |  ^" U  k
    -10(9) <= target <= 10(9)" L; ?$ {- a9 r  G5 S
    思路
    " M3 G/ E. ?( F1 M) q7 ^关键步骤,与二分查找不同
    ) F  k* D- q: e# y5 r/ sif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);( ?' c& A% [# P3 _* k- ~
    target==nums[mid]时,不结束循环,继续进入0 \- h3 \; e- l7 ?% e
    两个if可以同时进入,寻找界限
    7 }9 Y2 K% Y  d- ~5 s7 y设置限制,防止mid-1,mid+1越界1 G4 C3 o- K, Y! T4 Q
    代码
    4 K3 ~' i; h. h0 jclass Solution {. Z: a/ Y% c8 R/ ]
    public:: q& W0 ]' V+ `) C0 K  l* {9 @# ~! g
        int left=-1,right=-1;
    5 p+ I, j! N* q9 d6 A/ E    vector<int> searchRange(vector<int>& nums, int target) {
    ; E4 K: g: @- K$ L- }, h        if(nums.size()==0)  return vector<int>{-1,-1};+ o/ m/ x, S+ V! s) R
            binary_search(nums,target,0,nums.size());* Y% A  ]% `5 V5 b" r! E
            return vector<int>{left,right};5 V8 z0 Q1 r0 R+ }. t) Y
        }8 h3 f* P8 ]  ?, ^/ \# a& t
        void binary_search(vector<int>& nums,int target,int l ,int r){7 J% F5 h4 v8 \9 A6 ]3 \5 q3 M
            int mid=(r-l)/2+l;
    # V3 m+ f3 ?- j2 i( B        //printf("%d-%d\n",l,r);1 U$ @4 t! q. |& `, Y$ c
            if(target==nums[mid]){- l( u: C" W4 W& [3 s# `
                if(left>mid||left<0)  left=mid;+ a( ^# j, T; Y+ U
                if(right<mid||right<0)   right=mid;. X$ n, U. `- }3 |" ^5 k! w0 T' y
            }' X% `4 H3 j0 B. k
            if(l>=r) return;: M8 W2 M2 y6 V8 [
            if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);* E3 d% H/ r* m1 D) H+ _' Y
            if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);' H, g) U7 C% G
        }
    7 e/ q$ Q$ K; m9 G! V* B* b};
    7 ^4 w$ k' i) i6 v# ~
    $ x, K6 c" S: x# H( l————————————————
    ; \# E) B! e& ~1 l/ I& A版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 l9 u( I2 l4 ^0 q
    原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488327 [# u' _8 W7 f. x0 M
    9 r1 a+ J5 x6 A$ l9 K

    9 J9 ?. T8 D% q% ^* g
    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, 2025-8-18 04:45 , Processed in 0.709945 second(s), 50 queries .

    回顶部