数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-5 16:45
标题: 34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置8 M8 m, T8 c5 J* x
难度中等5 y, G/ z0 E8 s' J
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。. U( I2 ]6 b# B: h/ a) o
如果数组中不存在目标值 target,返回 [-1, -1]。
& ~0 [+ z- d6 q你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
+ V! Y/ i7 H& M# u. Z" g0 n
# K1 H; }2 @2 X) p* P. j: W示例 1:
+ N. i& V5 i& u) O* o$ g# l输入:nums = [5,7,7,8,8,10], target = 8' F$ m) G8 ]  Z+ I1 v
输出:[3,4]6 [  ?' R2 \+ s! d2 z! d6 W# j
示例 2:( T: F& C1 Y5 u$ V/ w, b" X7 H
输入:nums = [5,7,7,8,8,10], target = 6
) x- N* R$ g7 g. B. I  H& B6 V输出:[-1,-1]
; T4 Z( W* @! [( I4 m% r( o2 i示例 3:7 [, r0 v1 F& ?
输入:nums = [], target = 00 }$ p# y# {4 V+ }
输出:[-1,-1]7 N( G7 ]. `9 Z& y, \+ P
1& z1 W" `. ~6 I+ l% @/ M/ B
2" e9 a+ \( D+ n7 Q3 U% S
3
; b& n' o$ X, U3 X( X4
7 E" E$ W- J! _6 ?9 C52 J' e$ f) a4 T
6
3 K7 I. C( p" u1 {  h  @6 k) s7
- h- t* d& U6 j: Q" N6 {7 u8 U# s; U8! \( q. h* J: _) `* w! u
9& e6 Y6 K0 v! k( p3 Y0 f( o
提示:
% x  N3 Y' G0 N. s' E6 D+ c6 a% z" C
0 <= nums.length <= 10(5)! p$ [. ~; H6 D0 G
-10(9) <= nums[i] <= 10(9)
, k% i7 }% W$ M0 o- U6 ~nums 是一个非递减数组
' ?, K! E6 z8 \( X-10(9) <= target <= 10(9)' i' R# Y! K0 s4 m2 H, @
思路
5 o: ]2 m9 ]" ]7 ]! O关键步骤,与二分查找不同; [2 }/ Z5 I/ u, Q
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);/ x; a3 ^: c+ s# U( P: b. L
target==nums[mid]时,不结束循环,继续进入
' O& T5 w/ o, y6 v* Q两个if可以同时进入,寻找界限8 O7 R' K0 r% D9 ?9 a5 x0 l' Z
设置限制,防止mid-1,mid+1越界
! \) x- O- ]. N/ R# ~代码9 u7 ^. t# w! w0 `, L' X$ m/ ]
class Solution {' g3 I9 D4 [6 U- {3 B0 [
public:
) G# P8 x$ F, R, B' c, q    int left=-1,right=-1;4 c0 M; l, u1 E4 Z$ N. B2 p
    vector<int> searchRange(vector<int>& nums, int target) {
1 x7 }* j% t* w# X4 l* o. c0 O        if(nums.size()==0)  return vector<int>{-1,-1};* b+ w' y7 g8 k
        binary_search(nums,target,0,nums.size());0 B2 r/ P- o( Y: }
        return vector<int>{left,right};
6 g8 Z! T* a( F: i& A  D2 N    }7 L, Q" r# t  U. ~5 Y' M7 D
    void binary_search(vector<int>& nums,int target,int l ,int r){
- B" c9 ]% _+ l4 \+ Y4 C        int mid=(r-l)/2+l;
: R+ a$ |( g3 {: t! y; N' V        //printf("%d-%d\n",l,r);* Y5 p3 n; _: ^, s) b8 _; q8 y
        if(target==nums[mid]){1 `. v8 j4 |) Q! ^2 ?1 k4 A6 P+ [
            if(left>mid||left<0)  left=mid;
$ `0 A7 z. M, x: A! I            if(right<mid||right<0)   right=mid;
/ d0 E- ]! Z- L' b2 x& e$ e0 ?        }
3 X3 d6 [6 [+ Y$ s( x  ?! G        if(l>=r) return;) T/ U* p4 ?! a9 X
        if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);
$ C; p" @$ J; e$ Q        if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);
( }/ x: ^/ I/ g$ N    }: O" v1 D% K6 D3 B* z# @: r( C
};  q# P) p6 K  y
. k/ Y% f' H: M2 _" P" s" ~
————————————————' v+ u" B: P* ~6 v
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. G6 I9 |* ^7 m5 |( r& Z原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
) D) Z" v+ M' N( X; F7 n
: A1 _. r; A6 f3 e( G3 M9 b  I- Y- D4 z/ `1 N; W. i





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