- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 555561 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172041
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置5 e( ]) E: M% a) D) q
难度中等
+ A5 n8 b% ^% P# G' R9 ~ ~8 }给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。' E* o3 J; F7 K) @* k/ {, q
如果数组中不存在目标值 target,返回 [-1, -1]。
* r- \5 }* l9 M P你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
+ s, y z) K2 m3 _% k
# p7 t. K5 Q B3 |% t, a示例 1:
0 x& U# o* [; b9 u# [输入:nums = [5,7,7,8,8,10], target = 8% n8 `- n* F- \+ q
输出:[3,4]' c" w$ j! B1 p" s( @
示例 2:5 Q. K5 ?* M. T Z
输入:nums = [5,7,7,8,8,10], target = 6
5 _: w L+ p! ?0 t* Y) e输出:[-1,-1], b! y! r% X9 [$ |5 X/ t
示例 3:
8 |: b; ]$ Q I输入:nums = [], target = 02 `3 R: {- Q. Y, ^1 A# m1 B
输出:[-1,-1]
~ A/ E% w/ b) N7 V0 r$ H# G1
2 A: _0 Q: b+ @# g9 Z a0 `' q2& K. Y* z. o/ G( Z
3
& x1 P* U% s, r5 ~% V9 h' v) W4" n# G% j, j+ G0 Z5 P: n
5- v% s' |8 t) f; }1 U
6& A6 U2 T, f/ S: A% p
7/ _7 q0 D; p3 O6 B
8: O; r2 N- k% S0 S9 W3 n9 o
9, J5 k! k2 ]4 _+ C6 F6 | k
提示:% T% E' }( {! u4 c) }0 ^
& a6 C n! z8 F- X |3 h' P
0 <= nums.length <= 10(5)
* c/ X, j6 ~& q& }0 E7 W-10(9) <= nums[i] <= 10(9)
$ Z, }& O7 G2 Z' b+ ^2 u" s5 P& `nums 是一个非递减数组8 R1 [) v! G! X7 C5 D
-10(9) <= target <= 10(9)3 y% \' j& w6 v8 P( h
思路
. I7 o0 [ `: Q5 g关键步骤,与二分查找不同
i% [9 Y M6 |3 [" a7 ]if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);2 ]4 H- Z& ], ~# R
target==nums[mid]时,不结束循环,继续进入; M2 V0 J6 h# S, [" s- l1 B
两个if可以同时进入,寻找界限& Z7 Z- \9 [( z2 ^/ u3 f
设置限制,防止mid-1,mid+1越界
4 f3 l0 I) D5 V1 ]- T代码
1 d7 h. J& |" T; G7 cclass Solution {
& D. R2 ^3 G' q* m, spublic:/ m+ ?2 @; R1 [# O" a
int left=-1,right=-1;
5 H! R F/ I& }7 B vector<int> searchRange(vector<int>& nums, int target) {
0 v8 [; U9 E8 A if(nums.size()==0) return vector<int>{-1,-1};$ R! c% ]* N8 G. G. W
binary_search(nums,target,0,nums.size());- b1 X& M3 ^& D d @
return vector<int>{left,right};5 O9 m; w. v7 N; q( `& ]. o
}
" t! E/ {: i0 p' X e) S5 Q a void binary_search(vector<int>& nums,int target,int l ,int r){4 h! O% F+ E% E: N$ |
int mid=(r-l)/2+l;
) u. _7 @& n q9 ]- I3 h+ [- o //printf("%d-%d\n",l,r);
" ]. @. L) P/ N! V; k$ F if(target==nums[mid]){1 V( m8 U2 O5 e/ D: p
if(left>mid||left<0) left=mid;
6 `7 U5 a) S# M7 O& r0 I if(right<mid||right<0) right=mid;( \) M: F: ]4 n2 W1 @" \' u( o1 b
}
0 E% f! J9 K/ y5 a/ }- M$ y if(l>=r) return;" H5 M2 {/ U, L8 D
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);6 U' c8 E8 K: \% y P
if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);8 C' T, N. R- X9 S* X: u( s
}( q& S' s I0 w6 m6 p2 Z
}; x2 |8 D+ y f# Y4 J( ]
6 `5 w$ P1 h4 i# p. O1 g. y# d1 a————————————————; E9 g, E& r7 ^/ J8 l
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( b. Q; f+ p' D! A原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832# K7 E" C7 F# n4 E# y
) I1 z' V* c0 s' ?
0 s8 t5 r4 \$ d1 h2 e |
zan
|