- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563314 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174217
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
7 V" Z) R9 l& ]3 @7 s. a% s7 b- B* ^难度中等
) ] u1 j# Y" \$ ^( p6 d给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。# P: B V L1 c& E
如果数组中不存在目标值 target,返回 [-1, -1]。7 ]5 W+ f7 Y+ \" O
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。9 V+ |) K2 j: E2 Z1 T. z
& c8 |" n' z9 h) c9 _9 ~3 ]
示例 1:
2 F) p7 h( B( X* S输入:nums = [5,7,7,8,8,10], target = 8
9 \/ h# m& b, K/ T/ L: u输出:[3,4]$ I0 R5 e! C; m/ t
示例 2:0 n6 `( M% @5 d% g+ S h
输入:nums = [5,7,7,8,8,10], target = 6* c9 q5 i0 H4 Q; f, j9 z6 ^
输出:[-1,-1]
9 n p% r% b. B% X) D示例 3:
* |5 D6 c: D) X输入:nums = [], target = 0& s8 F, |! q( D. t+ Y
输出:[-1,-1]
5 V0 R& o s: M" H( l1
3 Z' n9 Y9 c" n! R2/ l ]" I2 ^) L! p
3
9 P* f" X( ?6 d! M) I" N- T" h' S4$ U8 ?" t) H3 o+ M+ s' i
54 M6 h$ V) U, _: f* m
6
1 F. I6 W7 @4 p. C7. D. l( p D0 R' N! m4 a2 a
8; ]. V8 j4 `5 O6 ~2 d( z& q0 W0 K
97 N) C) G; ~0 A: f7 ]5 T2 ~1 k
提示:# s( e4 @; Z6 @1 L$ Q6 F8 t% t' H
* p/ Y0 P Z C" p/ V: | c
0 <= nums.length <= 10(5)
# `/ Y/ h& C( m5 T: N; ~-10(9) <= nums[i] <= 10(9)
" s! ]5 ~" k- o4 f6 P5 Xnums 是一个非递减数组
- C2 g7 \8 }8 j-10(9) <= target <= 10(9) y5 y" S' J; @! S8 I+ V2 [
思路
# d3 T! E* B! C# u' A% [3 d关键步骤,与二分查找不同: e! i% x- x9 m' p* ~% B, t
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
* ^' e4 L+ f9 f0 M9 C- q" itarget==nums[mid]时,不结束循环,继续进入
; `3 u! Q% A" C/ O两个if可以同时进入,寻找界限% z+ H; X5 d; f) ]$ D
设置限制,防止mid-1,mid+1越界5 S+ N( M& l5 W2 q0 \
代码
9 G, R+ u7 u7 ]; D- p6 {8 n3 rclass Solution {- l! _: }/ {, ]2 v
public:( f- L/ b/ X4 R8 S, Q) ~
int left=-1,right=-1;- A* G6 r" G. I- c- e
vector<int> searchRange(vector<int>& nums, int target) {
& t4 V3 m7 R- ? H: R if(nums.size()==0) return vector<int>{-1,-1};
. G2 N: E* W) {2 q: O binary_search(nums,target,0,nums.size());3 P5 R* R2 M% h: z3 C
return vector<int>{left,right};
, o& Z$ c( B, x+ u8 B# u }/ Y6 J0 A& } x: ~
void binary_search(vector<int>& nums,int target,int l ,int r){
! P6 z% o5 z( l' v' a' D; i( I' F int mid=(r-l)/2+l;
: b1 {7 x1 {* O9 [ //printf("%d-%d\n",l,r);
2 d2 \( X1 f3 N6 ]! g2 Q' b if(target==nums[mid]){ x1 p( e8 R1 G! G
if(left>mid||left<0) left=mid;1 [: n: _- S% e5 Z- W- O
if(right<mid||right<0) right=mid;% R1 M, c F0 N/ q
}
! v- M/ l* C5 a. z8 Q9 P7 _7 J if(l>=r) return;: X2 [- j) W) C( z( c% E) A9 o: L
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
# H1 `. g1 i& C; M5 t2 s# c: B if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
" U/ v& B# ^2 D! ?& ] K. }9 y8 V }
- o+ ?4 V: q# i* A, Y% m};- I. b7 \) b( L5 R9 C) R
}, d; F; D7 I7 L9 u4 t
————————————————
p5 Q2 m0 o( I& C! {版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
P# V6 W3 Y* F- Z' G, c/ r0 i$ ^原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832. C1 R( x$ q3 }5 Q7 i6 n. f. }( G
- F/ i* K! i5 x6 F- B9 m0 e1 {& R0 u
|
zan
|