- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563328 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174221
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置/ q4 ]7 [3 L: G9 k+ U
难度中等
s, l$ r. Z9 l5 w给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
6 E9 ?0 B# h: U% B如果数组中不存在目标值 target,返回 [-1, -1]。
7 s1 k( B" L/ O% G+ U你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。9 Y6 b. E: J# l4 o# g5 M |
9 X4 v1 g+ l0 Y, H- q4 X
示例 1:
1 X# T" B' q- D* H& h输入:nums = [5,7,7,8,8,10], target = 8
% ]+ n' W% `0 f! c输出:[3,4], M6 \9 J/ X/ V. k
示例 2:. I2 e" s4 q6 B m$ X3 h9 k; p( k
输入:nums = [5,7,7,8,8,10], target = 6
+ f7 O! Q s7 k, \) N# P( P输出:[-1,-1]. H" P6 K1 r& a: W5 _
示例 3:
+ F) H6 X L6 W8 R4 Q输入:nums = [], target = 09 y) u- x! i" A' S* s! Y
输出:[-1,-1]
: ]$ p9 |5 w' L1 [1* N! ]4 R& Z9 Z/ M1 U* W4 H
2
1 t# B: w* _5 L9 {3/ l y1 t- i* l) H+ t0 i) d
4$ m( @6 C( q- H
5% u+ e' N O, G
6
5 k" i1 R h( p9 _& w74 k& {+ f& ]8 H9 q! m: j# w
8
+ {( D0 ^$ s7 [ K+ q+ s# u4 I94 a2 S( g% K2 ^2 ?9 z" S
提示:) m. ?3 m9 a) J; r
& d* V5 U, V; m W0 <= nums.length <= 10(5): ]$ P( T/ j9 d3 R
-10(9) <= nums[i] <= 10(9)
9 o* A, i* j5 Z4 m" Lnums 是一个非递减数组
; a( c' t' [* p0 E; s$ p/ k7 n-10(9) <= target <= 10(9)5 w3 I+ r: B( k7 h6 `4 c# K) a0 b
思路# R! m# V5 x0 I# r
关键步骤,与二分查找不同
. |0 M) } {" C; I+ u1 \& h; D! v- qif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
, G; f# Z6 T7 L* ^ L' T1 b9 Otarget==nums[mid]时,不结束循环,继续进入% W9 |- r. t: D' |: _+ Q- e! f( K
两个if可以同时进入,寻找界限( ?0 ?2 _0 L7 W; q
设置限制,防止mid-1,mid+1越界
( c& ~1 v6 ]2 f# X3 r: Y1 v6 h, M代码
# D! j8 G6 m! bclass Solution {
- [1 d8 P Y1 ^* u W+ bpublic:
z9 l9 K2 @3 X int left=-1,right=-1;
, }2 e- n6 j, Y: n. k# t* N vector<int> searchRange(vector<int>& nums, int target) {$ W; V8 U6 i. C4 u
if(nums.size()==0) return vector<int>{-1,-1};
3 u8 w8 T6 q4 } Y7 ~: C7 r binary_search(nums,target,0,nums.size());& S; d* C: ^- p
return vector<int>{left,right};) E9 n0 Q* H- w1 |- y
}
2 N5 F) n9 H- W$ ^' Y void binary_search(vector<int>& nums,int target,int l ,int r){# ]# P6 Z; ?! [3 X0 P6 r2 {
int mid=(r-l)/2+l;$ W I- @% L- E# ?$ o* q
//printf("%d-%d\n",l,r);
: {. R- I6 o( F& a2 w9 n! m; G if(target==nums[mid]){
2 X- O8 m) i& j! @0 e if(left>mid||left<0) left=mid;7 }6 ]9 E ?4 J9 y' t- j
if(right<mid||right<0) right=mid;
$ m/ M8 ^" ]% G: k' f- ~/ w6 ^ }
3 k+ o) K/ }7 Y, ` if(l>=r) return;( q! o' F: ]/ M5 A ?
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
0 [$ d7 Z. r- _# B if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);3 b1 m+ r/ \9 Y- F
}
+ u9 x0 {7 J0 K/ F) t5 Z; y};4 q. r# F8 M# s6 ~6 u K
; S5 j D" [2 I$ u————————————————
$ r/ v, X& B; n; H- y$ J, T. F版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 Z& T' a6 p2 G8 g8 e0 [# Y4 j5 u/ x) _原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488328 \) I2 \# B2 n3 L8 W- B3 |
/ C) ~4 d0 Z0 c1 X( r2 H W* C5 m" s+ @8 Y5 s5 @ L* ^% |" O
|
zan
|