数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-5 16:45
标题: 34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置3 y! G$ C$ I# r5 w
难度中等
0 R6 E& c% j$ W! J5 H6 Z- A0 Y给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
( X; G$ Z  i; X: ?2 [' J如果数组中不存在目标值 target,返回 [-1, -1]。
5 D( ^: O# E1 d3 l( y你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。6 {8 k/ n0 M; A
% U( L' X" Z6 b$ m* u& c
示例 1:
0 x! {+ E- ~, C% R5 t输入:nums = [5,7,7,8,8,10], target = 8
& z( g, y: \3 k2 B& j输出:[3,4]
2 t3 i$ A1 @& V! l示例 2:
  f% h2 a& ^( q  O' T& t输入:nums = [5,7,7,8,8,10], target = 6% y1 c8 ~' h$ [3 W8 a4 h/ \
输出:[-1,-1]
/ e% @. n. J# T! ?+ e' k9 k: V示例 3:8 Y4 s& {+ f0 z; h
输入:nums = [], target = 09 u7 R* h: ]0 w" x" k( B
输出:[-1,-1]7 X( G3 _6 X1 Z
11 c' o; l, c5 d- C7 @2 E
2
$ u' v: E' I0 \# N( G" Y, y3
% H, u. ?# [$ E7 a# x0 R  R4
1 f4 f. D- a! G- d. o* C5. M5 N3 @4 j8 D8 N( Z, S* J, F! h2 H
6
) B7 R5 B, R2 k3 D8 y+ t+ v7
6 P* w$ d4 O, _7 _) }8: ]& |; @4 H, W1 N& S: E
9
* _) y1 q7 C2 v* c9 Q) q2 D# G提示:
& j! C5 @1 c0 a' x* ~" _. h/ H
5 i; V# {1 J9 e5 k+ O0 <= nums.length <= 10(5)
3 H- v& p9 ]4 T9 I-10(9) <= nums[i] <= 10(9)
8 S  ?1 X% w% j; a4 k& {3 znums 是一个非递减数组& ?4 m; E/ {7 i3 M" o
-10(9) <= target <= 10(9)3 O7 O) s& ~) m" I
思路
4 e3 r9 S9 I" p" ^: p, {关键步骤,与二分查找不同
- Z' x& N; e% W4 F" r2 P3 {7 Y! @+ I. ]" Vif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);) ^2 J8 H8 k# U  e* T4 m3 P
target==nums[mid]时,不结束循环,继续进入" z  k5 Z( O$ y  K: `6 z
两个if可以同时进入,寻找界限
* I# f2 ^+ f' L. I2 \设置限制,防止mid-1,mid+1越界
& A+ [3 K2 l( H6 q, W) \2 O代码
8 v8 ^6 a3 Q8 sclass Solution {
  O$ |3 o5 U1 t  _$ H3 r/ xpublic:+ v6 Q) B5 _, z$ G3 e: Z: m
    int left=-1,right=-1;
. r; y, h/ w4 p% O7 K    vector<int> searchRange(vector<int>& nums, int target) {# @( f" K+ [0 L$ Q6 o. ]' ?, [$ i
        if(nums.size()==0)  return vector<int>{-1,-1};1 O5 T* T6 r: Y: S: ^- G: q8 [
        binary_search(nums,target,0,nums.size());
9 ]1 y" Q; l' t        return vector<int>{left,right};
. {! [3 @1 i, @! a    }
5 ?' A  I. u4 ]/ s; M    void binary_search(vector<int>& nums,int target,int l ,int r){
7 O# c3 m5 i& g        int mid=(r-l)/2+l;
3 X+ [6 S  r' b( z: {9 a& h0 n! L        //printf("%d-%d\n",l,r);
( i9 M- P5 x" V& F; h8 x2 V        if(target==nums[mid]){; W9 C: |9 p% Y' y: V' T; y- m
            if(left>mid||left<0)  left=mid;
+ b" r& r9 o# K  T& O            if(right<mid||right<0)   right=mid;
8 `9 B# n* }. \: P        }
8 P0 x% O6 u( U" L        if(l>=r) return;
9 c/ N7 l' L% p, v        if(target<=nums[mid]&&mid-1>=0)  binary_search(nums,target,l,mid-1);
" r* g! T" w. [+ g8 r5 h' h        if(target>=nums[mid]&&mid+1<nums.size())   binary_search(nums,target,mid+1,r);
) E9 w& B2 E& K    }
0 }, z: `  h* C};2 P. H& @0 j. N+ Q5 n
  P. x- ]5 h  j9 R. Q! Q
————————————————
0 ~6 |) H/ D8 z4 v7 o9 e版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; d+ R/ R. n8 k( B
原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
8 y/ ]$ f* `6 Z+ B, H- R0 h  x/ I/ M/ `3 }& C7 U1 N2 {
! B3 O/ p! T+ I* Y; N. |. g/ ~





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