- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565164 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174772
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
3 `. u. A* `# d d难度中等
9 m5 N4 p) t' P5 d给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
+ w& i2 B- T5 q$ r5 F如果数组中不存在目标值 target,返回 [-1, -1]。% Q) H8 a8 a& E8 n
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
$ f8 q4 c4 F) R) _: o7 d3 T7 B) N- l$ j5 u
示例 1:
& h# J v" \ _输入:nums = [5,7,7,8,8,10], target = 8
3 V V+ k6 [+ e3 k& D输出:[3,4]
& I, T& y9 e9 o4 {6 p$ ]! R示例 2:/ l8 l1 Q7 f- _' b( b
输入:nums = [5,7,7,8,8,10], target = 6. L% Q% v1 c" J" j. H# m. w, P! [
输出:[-1,-1]- Y9 n9 Q4 ?: S! j o
示例 3:( m- m! n4 f& `! N
输入:nums = [], target = 0
4 |; N. v' m9 C# P' ]输出:[-1,-1]
6 ?& [* p2 q# _5 x) f14 n; E1 R' W+ \& w
2
; X1 i; @. @9 a7 J' z3
9 n4 Q9 e$ d( ~" k+ h" y4( n2 [0 j% s/ u# O7 C7 e
5
( A# z) l2 x, `6
& N; { ]. I. i( X( {& C, C7% L+ _8 G3 O7 {) s% S
86 T, w) B8 ^2 R8 v! K8 J8 v% F
9
+ ~- q& Y6 M% n9 y) H1 t提示:. Q, d4 W- z$ Y- d
J, Q- K$ R' ]: t0 <= nums.length <= 10(5)
: T4 x/ ~3 j8 X9 {-10(9) <= nums[i] <= 10(9)0 |6 \$ [ S6 b; b* r. t3 c4 A
nums 是一个非递减数组1 m7 _4 e s* i, {% f& t- p
-10(9) <= target <= 10(9)4 p* a* l' r+ H& j6 V
思路
! e5 @4 e. o( T0 u' M- m% a关键步骤,与二分查找不同" k7 G! p! Z, I4 J7 K, H: v
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
& E+ C( |, {' _2 E" p3 utarget==nums[mid]时,不结束循环,继续进入
1 |/ M; V" J: C1 P/ G- [两个if可以同时进入,寻找界限7 L( e: {/ I- Q, w$ i6 B1 c! g
设置限制,防止mid-1,mid+1越界& a; A% W _8 `4 e& I
代码
) F1 m/ [( {* l. l! b4 @9 j5 D/ Hclass Solution {$ q1 O* Y: j! k9 T) \, q. Q, N: b0 h
public:( T g8 z! B$ G/ j
int left=-1,right=-1;
! M; R" d, s5 o) i( m vector<int> searchRange(vector<int>& nums, int target) {
! a% K# Q3 a1 _3 _& x if(nums.size()==0) return vector<int>{-1,-1};
5 M% D7 o, R% w1 ~6 ]$ w# X" d% C- @ binary_search(nums,target,0,nums.size());
9 h+ ?( }( [+ D* ?2 J* g7 X M return vector<int>{left,right};* c: M2 a0 d |7 k7 H# @, c
}& u; h5 ^& R/ Y; ]4 C
void binary_search(vector<int>& nums,int target,int l ,int r){8 x p/ ]+ m% k
int mid=(r-l)/2+l;" Q3 i% J E) v8 Z% k
//printf("%d-%d\n",l,r);" C; V0 ^3 G0 ?
if(target==nums[mid]){. ]' Z% }! h: H$ a! i: n8 i
if(left>mid||left<0) left=mid;
& |6 `. N3 u$ z/ I Q4 T" v" ~; } if(right<mid||right<0) right=mid;
" z" x' }) j4 w! z, K }4 U' t) |; {: K
if(l>=r) return;0 g8 o0 g: @4 P( q0 ?( P2 V- N7 G
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
6 O0 t2 k& z: { [ if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
f5 c8 T* m. l, y5 _ }6 A7 {8 i6 G ?9 u& c9 q
};
9 B" M+ s5 y7 U; z) w7 [- [% n
! j" N: Q" W, N) c, n: {+ u: A0 G0 ?————————————————
- I% v: n; X3 Q! H5 O2 U8 d& w0 q8 z版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% q1 C! K, a# a/ ?
原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
: r) _* c$ b' ~6 N7 ^4 r2 F# o& t) Q8 _" Y
! B. P, G2 s4 h6 ]
|
zan
|