QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2726|回复: 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. 在排序数组中查找元素的第一个和最后一个位置+ O' s2 v( |3 W& S
    难度中等1 Q. N. o$ i2 n! D: d  Z$ x
    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
    ! l0 ?3 c' O+ j# }4 T% N. k如果数组中不存在目标值 target,返回 [-1, -1]。$ R6 u6 U. L, v. N
    你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。( A% `# i$ r/ {' n/ y2 L

    : J) I/ `/ U- g示例 1:, x) q  x5 R, N" R5 v, g$ M0 h
    输入:nums = [5,7,7,8,8,10], target = 8
    ; H7 z$ S6 a* d$ {, O输出:[3,4]# s0 v) _- M, H4 s
    示例 2:- E: d8 t# d! X! E# u: e% [1 z
    输入:nums = [5,7,7,8,8,10], target = 6' @3 ^8 F1 [5 B1 s2 J: `
    输出:[-1,-1], a- p  D5 j/ W9 Q7 k7 y
    示例 3:4 @( d; C0 T5 U$ S. B
    输入:nums = [], target = 0- w% S4 L5 a3 m  T: C
    输出:[-1,-1]
    2 w  E% G! u4 H2 M* N1# B" P% U( _7 h2 x/ X- b; F8 E
    2
    : r! x4 e0 J' c3( }' G, f& }7 e* {7 L! x
    40 U; c; l/ W* n, |- a6 H
    5- [. L9 x7 ~' U2 N' ]- @+ Y
    6! H8 N- B& x5 p: U4 A, w
    70 n. J' t7 w2 P9 r; Z6 M5 E' l
    83 x' K" u# j  z) _7 V
    9
    6 ^) T8 c4 B. F( l* K提示:
    3 C* b2 v+ ~# B6 A8 r! `' k7 a6 v% y
    0 <= nums.length <= 10(5)
    " }2 j1 J: E6 Q, q7 x-10(9) <= nums[i] <= 10(9)' n1 Z2 ~6 I( U/ h
    nums 是一个非递减数组' ?3 k- _, V0 y- p- J
    -10(9) <= target <= 10(9)) @* E4 Q# X( R8 S+ Q- ]' m
    思路: G0 a& ~' D) j9 r
    关键步骤,与二分查找不同
    4 C0 e" F* g. _2 oif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
    6 ~+ |/ _. ^- e1 n/ }target==nums[mid]时,不结束循环,继续进入
    % Y& W$ [  z) s两个if可以同时进入,寻找界限
    ! X; s6 t3 p1 L. O! G6 g1 d. i设置限制,防止mid-1,mid+1越界9 L6 i& E1 h$ }) ^; {/ q
    代码: |1 N( P! U* u3 C! T2 w
    class Solution {
    5 n9 V# F2 F( E  V" ]8 ]& ^7 l7 Epublic:" S; p2 e5 H0 Y% d0 C7 n0 v
        int left=-1,right=-1;; G" J! t. o6 s: U) O1 F9 E
        vector<int> searchRange(vector<int>& nums, int target) {
    # i: R( r& M0 d2 p( U* q        if(nums.size()==0)  return vector<int>{-1,-1};1 \6 s* d/ ^1 x# o' I9 e
            binary_search(nums,target,0,nums.size());; K9 x4 [& Q% \: d5 M
            return vector<int>{left,right};
    0 n! e. f; t& Q! O* ^) ^2 [5 l' y    }
    # U" r7 ]1 i3 t2 n    void binary_search(vector<int>& nums,int target,int l ,int r){
    1 ]6 r$ |2 e# A. h; b' T* N: j        int mid=(r-l)/2+l;
    ! p5 R* A4 H- g3 m2 i+ f* h        //printf("%d-%d\n",l,r);; `9 B, e# @) ~" ]8 j) }" O( \
            if(target==nums[mid]){0 X/ j8 A  e! k/ g. A) i& i( H
                if(left>mid||left<0)  left=mid;+ F5 }( Y: i+ x, g
                if(right<mid||right<0)   right=mid;% \( g3 G' d1 |, K. {0 k0 a
            }
    2 s! E- `7 k. [/ ?" C        if(l>=r) return;
    4 Q2 u  M* c0 A& {1 j4 O        if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);$ O) `. d/ w) B# J. X: V
            if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);
    2 `& F2 o( n' o# y% S9 J    }! o. f4 B  a! ?& z
    };+ _4 J3 i2 r- x

    7 w5 h4 N5 O2 C# \( Z1 k————————————————1 E. l5 b. w1 [! O: o7 a( s! D
    版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % u6 |/ k2 K, m原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488321 e. [1 ]9 Y) g4 B/ {
    ( a. M" w4 `+ a( n' j- e
    $ g  V5 b0 M4 X" X8 ~* c
    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-10-9 06:32 , Processed in 0.363613 second(s), 50 queries .

    回顶部