QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2109|回复: 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. 在排序数组中查找元素的第一个和最后一个位置+ Y1 g4 W/ L' C6 ?( d
    难度中等, R' Y1 \7 ]6 M1 P5 W
    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
    ! M0 M) k% T+ i7 u如果数组中不存在目标值 target,返回 [-1, -1]。
    6 l6 P! x, _  j4 w: d& `8 Y2 ^4 A/ `你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
    4 X) J- \& G6 D6 i; M- W) f- N$ \; P) k8 T+ [
    示例 1:2 V; q+ S+ N. P1 y
    输入:nums = [5,7,7,8,8,10], target = 8
    " t9 C  C% ~" {输出:[3,4]4 T4 g" M5 H6 v$ H
    示例 2:+ {7 X. ]3 D% `5 h* s! A
    输入:nums = [5,7,7,8,8,10], target = 6
    ) ^' N7 P' u: j$ p输出:[-1,-1]" L# t9 D) Z# ]$ g3 o$ V3 Z
    示例 3:/ Y! k7 W$ X" K+ |% n
    输入:nums = [], target = 03 F+ r& n. [4 ^* \( e$ z/ K
    输出:[-1,-1]& a3 s' c3 X" ~3 K$ K0 V7 L
    1
    - ~; {- f# I3 d2
    7 R: E& T  q, f) f+ S2 |+ v35 n. g, W3 O& d& i6 w5 z/ r
    44 W# L# E* o1 v) q" M2 X% |
    5
    % w: X% t/ G) |" \: n# `8 k: X6
    - @8 O6 W; |  f. |7 M, A$ z7
    ! u; {4 s4 _) D! s# E4 G8
    8 C7 B/ a" H5 E' ^4 H' s9
      o9 n. M+ w# l提示:. m3 O" ^1 d3 A8 k' a# u
    - f! q% \2 x1 Z# U9 s1 J
    0 <= nums.length <= 10(5)2 ^: ]( s; A( b7 x* b1 p
    -10(9) <= nums[i] <= 10(9)
    ) u: {$ m  U; |9 c7 enums 是一个非递减数组7 F: t6 m1 p) `9 I# J( ]7 ?
    -10(9) <= target <= 10(9)
    + @7 W9 ~6 T& m思路( ~1 w# o- Q. t- {: s4 ?4 ~% A
    关键步骤,与二分查找不同
    & K6 T; R+ v: q- h8 `3 ?8 L3 N( cif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);; v) R  W& t; r! }
    target==nums[mid]时,不结束循环,继续进入
    & y3 W( S: }9 O4 m两个if可以同时进入,寻找界限' k" A6 W- v6 }: O. T# ^* t- b
    设置限制,防止mid-1,mid+1越界: d  @. p, n. u
    代码
    % q* l- Y  J8 [0 z- z/ F7 _5 T  Dclass Solution {
    3 l, e: X; {; o! s: wpublic:
    9 G$ R& b9 Y& @0 {, _7 p    int left=-1,right=-1;
    6 ]6 L2 Y+ `$ C, D    vector<int> searchRange(vector<int>& nums, int target) {: d, l+ e7 @5 Y
            if(nums.size()==0)  return vector<int>{-1,-1};  E0 T7 u3 ~- @) ~' }
            binary_search(nums,target,0,nums.size());& L' c( K" E' F4 U+ _
            return vector<int>{left,right};. a- \6 p. X6 g  \# E3 p
        }
    ! e# k  B, @5 t2 D: S$ ~    void binary_search(vector<int>& nums,int target,int l ,int r){7 d2 ]0 u5 C4 Y* G; t1 [# z
            int mid=(r-l)/2+l;
    : `0 ~7 E# J9 Q1 @8 w' |- {        //printf("%d-%d\n",l,r);* s1 N! `' C+ L) h* j* ~0 B
            if(target==nums[mid]){, V$ U. C& B8 l/ @, t2 h2 }
                if(left>mid||left<0)  left=mid;9 E- {5 [: X0 Q; a7 [' q! i
                if(right<mid||right<0)   right=mid;1 y4 \: r7 B! f
            }  N7 n. b+ k: ~& {6 m: o3 u
            if(l>=r) return;4 C- h# f5 H& k7 `+ X/ U" c
            if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);
    " _9 i0 Y' N7 d( f5 A6 X8 A3 ^        if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);
    # G3 g9 d( ^. d& K+ ]" N7 y! V    }. ]& E: H! h3 i2 l: J% V: h
    };* f1 r% H4 C8 i0 Z& w  F, s

    " n. a1 x5 E. I( t  T————————————————
    ) C' [: i2 K& n) k4 E, V: o版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. h, q7 g- k' S. A6 y8 b1 `
    原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832; O0 a8 J5 R; b: a( L) [2 H! k# R8 v
    - k6 X( g! T* s% X+ q* U
    2 D0 K/ B8 ]! x8 S
    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 07:19 , Processed in 0.279821 second(s), 51 queries .

    回顶部