- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565635 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174913
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置$ K8 a2 z E% D7 ?* W. Y7 p! x
难度中等, g" _; l! c9 ?9 B
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
4 r4 a1 I6 z1 v8 A* s3 K如果数组中不存在目标值 target,返回 [-1, -1]。" e/ i$ e( Q8 b9 t% r- Q
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。! Z6 ?4 }. K7 t l+ Z t: j
$ ^/ B5 O3 H, U5 V D8 C) D
示例 1:+ a: H, y6 U: I* l0 B( F
输入:nums = [5,7,7,8,8,10], target = 87 K, }9 {% u# K1 v9 v7 n
输出:[3,4]) {9 H2 n9 G+ v* l
示例 2:
2 u; L+ E% n b9 H2 Y3 `/ A( d输入:nums = [5,7,7,8,8,10], target = 67 @* Y8 ~; f# S( A4 j
输出:[-1,-1]) Y! ]# a/ j' M
示例 3:
& i k. h% L4 g2 j0 K$ X( x4 V- ^输入:nums = [], target = 0
+ d) o+ {, y# f3 H* O, f输出:[-1,-1]+ \6 ^3 a0 c5 [( S4 b
1' p# g2 K2 V0 Y4 n
2
1 C" u. w0 A$ k/ H- M& U: I3
7 a% s& |+ s7 J3 X/ a4
* ^- y9 |( y7 x, }53 R$ Z/ L& e8 \$ N9 v4 F- _, a: p
64 h( w* p4 z# \2 r8 e
7
U& ^- U E ]- U4 b/ x7 ^7 N: h8& p2 K# M9 F8 l. U* H9 H
9
" M: x6 `* C) r6 L% p& z8 c提示: M. p2 l2 t) Z3 u. _
4 \. x0 ~/ M1 J5 m4 X0 <= nums.length <= 10(5)
& V* ?& e3 s1 G& T0 k4 ~# {-10(9) <= nums[i] <= 10(9), m4 d$ D9 L, @4 P' O3 p. I
nums 是一个非递减数组6 Z) n) |' F/ E
-10(9) <= target <= 10(9)
- x) T7 u1 H* I1 f0 T0 X+ ?* B思路
( B$ t2 F( ]5 F V: f关键步骤,与二分查找不同8 S4 X" Q" t# d9 d& n: n
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
8 U" w$ `& Z z" C+ |target==nums[mid]时,不结束循环,继续进入
7 f1 `* [! G: V8 X/ G两个if可以同时进入,寻找界限1 g+ M+ W! i! T6 k. _; C/ i, M
设置限制,防止mid-1,mid+1越界
3 b+ \# K4 Y, `代码
: ]/ n4 o/ p5 b+ Xclass Solution {5 Y9 o4 F/ H7 v5 t7 ]$ d3 w$ k: I6 o
public:$ u* H1 Q8 n: \. r' a# |
int left=-1,right=-1;4 J" N7 `" \* L' u) N0 _
vector<int> searchRange(vector<int>& nums, int target) {
J/ v& z; W- q+ b, b if(nums.size()==0) return vector<int>{-1,-1};1 W( D5 o" ]/ U
binary_search(nums,target,0,nums.size());
8 Q& f3 M7 ~6 l2 C1 J return vector<int>{left,right};
. F; b/ s7 T' E1 g, _/ u }
+ b, I$ {8 j1 H/ ^1 ?' g+ B void binary_search(vector<int>& nums,int target,int l ,int r){
; H3 | v+ i, S( b% G! y. ?! {, M3 d int mid=(r-l)/2+l;
4 C" e' h& P W& l3 ` //printf("%d-%d\n",l,r);9 E# P# D; {3 n6 r
if(target==nums[mid]){
- w1 ]! R& U6 c9 u* h: Z if(left>mid||left<0) left=mid;
7 h$ G- a( |+ i! k! F3 Q8 J J if(right<mid||right<0) right=mid;8 [, \) z2 I! o
}! v, ^$ s# H; e. d9 g K
if(l>=r) return;/ ~0 R4 _; x" C+ L- Q9 I
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
( A1 ~. S3 \, s5 ~8 ?0 {- ? if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);1 b& C2 }& d1 f( ]7 T& a
}4 u' \1 f+ a, z* h
};* _% p5 w, x8 N
' l& f- n0 G/ c: J————————————————, C2 P ^$ @8 O2 L0 `1 T( Z8 X
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 m& r. B3 N+ s8 I0 s; u3 r0 v
原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
) U, {1 N7 ~. l: j' M6 H
. G9 v7 K6 i1 X5 M( b. \ H0 j8 B- s! j
|
zan
|