- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566252 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175098
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
% D! E- E6 j$ l8 h难度中等$ o5 T4 P9 Z: F6 q
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
U+ O8 }8 V) v; s如果数组中不存在目标值 target,返回 [-1, -1]。% `& Z5 ~2 @% C. [0 A
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
# Z0 t9 Y0 P8 }+ L/ ?! E {" T* U+ N) b& T7 o' [- d
示例 1:4 }8 G- W. g! v) f
输入:nums = [5,7,7,8,8,10], target = 8
0 ]$ |& {9 t- {6 k) A3 c, T输出:[3,4]/ B6 P$ U" v* P
示例 2:& y( \4 I4 g1 v% d5 D% e5 s
输入:nums = [5,7,7,8,8,10], target = 6
( X1 V n& R9 D( M2 {: s" Z3 Z输出:[-1,-1]6 s( m5 l; A3 c7 ~: f# O
示例 3:) P9 {9 a. K. O6 A
输入:nums = [], target = 02 Q: k& W4 z; z }0 B
输出:[-1,-1]2 k8 j$ A$ P- y u$ ^6 i* y
1
" v. ^+ y6 d1 K4 r1 n( u2 U2
( I1 ^% p" r5 W7 G4 Q8 M G. o$ G3
# g9 J- G/ |" z+ x( G44 x+ P% q$ u# A& h* s% F3 V6 g5 E4 f
5
1 j: n, S+ ]$ c( G6
& x) C: {+ \; O7
Y9 u7 _" R h' ~: t* @87 u4 v" _6 s9 m t
9
1 u. ^* V0 B2 C# \. h9 B/ B提示:
0 @* U! u1 _; }: C8 t7 K1 c2 a
. O% M0 P4 T3 G' B! }0 ~) U5 ]0 <= nums.length <= 10(5)4 y1 w& J" m. y) {* G
-10(9) <= nums[i] <= 10(9)8 K3 t x; n3 d% [
nums 是一个非递减数组
' \. E$ ^$ `- z0 H1 r! `) l-10(9) <= target <= 10(9)
9 p' h8 l% F) H/ j9 g* g# Z思路
, C9 b& [. Y' i( |" {( z- y: X关键步骤,与二分查找不同2 U% G6 [5 g5 U) y! n$ g- C
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);0 d1 B7 `# I0 p+ [$ U0 B c* P! ]
target==nums[mid]时,不结束循环,继续进入/ f4 e9 g) ?: P
两个if可以同时进入,寻找界限& i. e h, Z1 }$ ~, `- ]$ I
设置限制,防止mid-1,mid+1越界 W! A1 Z8 H2 X* q( O
代码
; _; r. C2 i" @" [class Solution {
. Z7 @/ c* d) V4 A6 lpublic:( J4 z& P0 { M! v7 j
int left=-1,right=-1;
/ o) ~# d$ T0 n4 {# w vector<int> searchRange(vector<int>& nums, int target) {
$ ~8 V' M( b5 @: C' P if(nums.size()==0) return vector<int>{-1,-1};
( Y; N, L/ p, R4 h- @+ P binary_search(nums,target,0,nums.size());
6 K1 A5 z2 s, h$ k8 a* c return vector<int>{left,right};
, l+ z* T5 A/ s& i+ P/ K& { }( N0 |0 m4 o- s% P$ F
void binary_search(vector<int>& nums,int target,int l ,int r){
2 P8 k h, A. `/ [ int mid=(r-l)/2+l;
: W. y ] s. d4 a U' m- i //printf("%d-%d\n",l,r);
. P$ f& ? ~* h3 y+ [) N if(target==nums[mid]){: ?1 S' ~0 g9 T- E
if(left>mid||left<0) left=mid;
" I+ _, I2 M* ]2 F* i6 J3 L if(right<mid||right<0) right=mid;- U3 O- @& H2 W; h0 E: U- G7 C0 C
}
' v4 Z3 v# m/ o1 X" V( k3 t if(l>=r) return;
3 J0 [/ ^3 m7 L if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);3 n/ E7 L$ Z& Y, O% L
if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);! R2 h1 w2 K$ M7 H& e: i
}
2 ?/ R' Q, N; e, t% _4 Z};
4 Q ~: L3 n" A& P! Y, O5 \
+ W' f: Q' A6 b% k9 L, c, w————————————————2 s/ `* }3 \! c. m; S
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
M4 w7 ?" D2 r! {8 C; x2 g9 O$ a* m原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488322 l$ H# z' Y2 q% o
0 u$ G- {% i; ] c7 z
1 _1 C. p( q" C1 N
|
zan
|