数学建模社区-数学中国

标题: 34. 在排序数组中查找元素的第一个和最后一个位置 [打印本页]

作者: 杨利霞    时间: 2022-9-5 16:45
标题: 34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置
' j2 F% t1 I) h1 @) t" y难度中等) q& u$ a0 c5 q5 X$ C& J
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
3 l. _3 [  A2 @% ~( H( l如果数组中不存在目标值 target,返回 [-1, -1]。
9 C! X8 E+ o* j3 W# F. P( l你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。& I% A' }2 U$ C! W* d0 P  g/ N$ L
% i. u8 K7 L( A# D* B3 D' E
示例 1:, j: ^* C' d0 K6 B
输入:nums = [5,7,7,8,8,10], target = 8
8 o, i. @7 s/ b( w+ K输出:[3,4]1 D# N+ |2 t0 \9 k
示例 2:1 ]" C( g( D: @: h9 q4 p' n4 R
输入:nums = [5,7,7,8,8,10], target = 6
1 t4 M" r+ K( x+ d& R2 ~: E; l输出:[-1,-1]4 y  c  ~/ g7 I0 w- p$ d2 i" }' `
示例 3:
9 J% [# |' r8 [  `9 s* i; N! Z输入:nums = [], target = 03 s/ e" c$ J0 h7 @/ d0 K* E- d
输出:[-1,-1]9 a/ l" _8 x2 g, H" Y) g
1
! H4 \2 ^% G. X  J8 j21 T) d/ b; \! t$ }- K  _( ?
3
( M, f- X6 t: Y7 _& p, @4
, Z! ]' L- m1 `) k7 [8 y. X58 c% s. \) j9 U3 g# H! \# J2 ~
6: q: M6 ?" ^0 t7 R0 Q; L
77 o6 P" a; P- L, f. N
8% |3 c  {) Y2 U6 @: l* t6 a5 X
9; m# u8 [2 C  h7 S' `1 B
提示:
* P* Z. ^# F. r5 m0 ]+ n+ J  e. A4 J1 E. f/ q: T
0 <= nums.length <= 10(5): Q, X9 l+ ]6 G* w
-10(9) <= nums[i] <= 10(9)& l5 \! }3 ?6 f- x' X* g
nums 是一个非递减数组; H7 a" C8 M& D2 k) W1 \
-10(9) <= target <= 10(9)
( t4 i, `. T3 V0 D思路
, j: l: m1 D$ i1 A3 l关键步骤,与二分查找不同
1 z, ?3 C% I. \/ v6 U8 V3 r3 iif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);$ n# }& e. c" A
target==nums[mid]时,不结束循环,继续进入
3 `* N& l' _/ ]$ t% I; u两个if可以同时进入,寻找界限
: V7 Q" S% }, ]8 O0 Z2 A! b设置限制,防止mid-1,mid+1越界% y; W% q- Q% _
代码
- H8 i& ^! o5 D  s4 z8 m2 ~class Solution {
, J, b# A, M% `. lpublic:
3 _1 P6 E# _7 A5 k4 Q    int left=-1,right=-1;2 C  Q" J! a5 k) z
    vector<int> searchRange(vector<int>& nums, int target) {
. |$ m2 M5 E* Q        if(nums.size()==0)  return vector<int>{-1,-1};
( X8 k0 L' d5 v6 M& p& [2 s        binary_search(nums,target,0,nums.size());
9 L$ C, `, L- r$ b* Q6 ?( v        return vector<int>{left,right};( @; u3 }6 m! f
    }; {6 m+ f* ?0 C  h# L, k1 W" L( z$ F
    void binary_search(vector<int>& nums,int target,int l ,int r){8 ?2 d0 l9 v! c) p- {4 @
        int mid=(r-l)/2+l;
( h. ^! Y  [$ p5 }9 T3 _        //printf("%d-%d\n",l,r);: X! k9 Q! E! @  u; v0 N
        if(target==nums[mid]){
& ^; D, o! A4 f; {            if(left>mid||left<0)  left=mid;
, _$ f2 B- f# I) T* i            if(right<mid||right<0)   right=mid;1 Q: E) _6 C8 B) X  b/ L3 v
        }
1 y! P% [& }- @+ _- H; g4 t        if(l>=r) return;0 W: u# `  ~# c4 B! q8 D
        if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);+ d+ d! k4 B/ Y2 ]+ Z$ Y3 b
        if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);
) ^- W# }0 i2 g& Y4 z' Q! R9 x    }
, v: g0 i( u0 s, r( h( g, t; h};. ^' ^) C4 q; A1 K8 `
1 d- o3 a" {9 s) B
————————————————& O5 V2 O  D5 ^2 c: Q, d3 g
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" B  J- ]6 s  Z# R原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
+ v$ _# U9 ~2 X9 k0 D$ Y
) x6 E0 z3 ^; @. y) [7 w
$ G" x- q  U, ?) z8 H1 A! @




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5