- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563256 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174200
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
" W" J1 O# r% Q难度中等
& h0 g2 w, e' s给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
8 s) A8 |* y2 e) `* R3 B5 N9 G如果数组中不存在目标值 target,返回 [-1, -1]。1 v) A6 r# ]7 [& ?9 R* P- X. J) g2 e6 ~
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
7 s n, u7 M) u9 ~- _& z% Q- K! R& S/ `1 f
示例 1:: @% @: F: H" ~8 w
输入:nums = [5,7,7,8,8,10], target = 8
& c, \! {2 Q2 V6 G; z% |6 F% y) P( o* ~输出:[3,4]5 ]' u! A" G E; ]
示例 2:
! m$ _% ? U. P4 ?% V! O输入:nums = [5,7,7,8,8,10], target = 6
) ]; }0 x9 {3 x1 W" G, W+ W输出:[-1,-1]
: k) t# x$ N* J9 ?) S- o- }5 L0 u$ P示例 3:
: m! e3 w3 ]0 k) ?' p4 }输入:nums = [], target = 0
+ L9 C: S* q0 K8 i! b* }7 c输出:[-1,-1]& V4 v- o2 g/ W5 \% F
1+ x- O9 J& |$ [4 P _
2
+ ~7 ~9 H! p$ k/ w* }3/ S6 Y2 e c- s8 s
4
# s$ G* B$ K- L4 J1 p% Q5
4 b2 D/ [- s, G6, U6 w% d* F: F2 w" \
7- P# s/ ~2 n# ]* q) t- w- v. x
8
- y9 x! \! a1 S5 _4 g& x! Z: Y9
) J( ?. X( l8 g4 X, n提示:5 |' f& R# F. v+ M/ I8 k
* `6 K0 N" r! G: E; \6 u4 l: l0 <= nums.length <= 10(5)( P7 l; @/ X1 s( O
-10(9) <= nums[i] <= 10(9)
( C& ~1 c1 @! _nums 是一个非递减数组& [% U5 s2 X& X* H; v
-10(9) <= target <= 10(9)
3 j+ j \9 B% w+ _' j' o; _; D思路
0 e2 e2 M' H! ~2 R# W2 U关键步骤,与二分查找不同
. n& w0 K* M% f1 \& nif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
% X( j1 G/ m) n: {+ q; htarget==nums[mid]时,不结束循环,继续进入
- p1 z& u4 n% I# O两个if可以同时进入,寻找界限
; ?9 \5 T7 Q% Q2 Z$ `设置限制,防止mid-1,mid+1越界
3 G$ i# ^/ k2 r, m代码
7 D* ]4 P0 k4 x9 V& eclass Solution {
& W- b) \- f8 I( a% Fpublic:
9 O1 E" t- s* u" l. c: C8 H8 r int left=-1,right=-1;+ o7 ^& o+ ]* c X5 q* v$ m
vector<int> searchRange(vector<int>& nums, int target) {0 C# O) N% X' n8 O) u; I+ x6 Z
if(nums.size()==0) return vector<int>{-1,-1};
" R* j+ A/ e4 d* O ]# f2 f binary_search(nums,target,0,nums.size());7 b' j" ]( B7 B0 [
return vector<int>{left,right};
2 _& r8 \7 i1 Z3 K4 x; s& x }
2 {) ~; z6 [; l. J void binary_search(vector<int>& nums,int target,int l ,int r){
! `( ^: Y$ I* q+ J int mid=(r-l)/2+l;+ \/ @& F, f5 q t
//printf("%d-%d\n",l,r);
4 k" w! Q# Z, }5 D if(target==nums[mid]){
4 _( [! v$ `+ R7 _ if(left>mid||left<0) left=mid;% C2 F& j, |) B) ~
if(right<mid||right<0) right=mid;3 r# l6 T. d) [" Y
}. O y# j2 M* G+ ^: z- H
if(l>=r) return;, c7 K4 a6 _/ S; o
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
0 g% k. g a5 f if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
6 X' e% t0 ]& b& z3 [% U }
( ?7 X4 W d3 a# {; B5 a};
" [- V9 Z' G$ N7 X) Y9 W
% Y) V3 D1 w" g————————————————! A! U) C q1 A1 j2 O5 G# V
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% a% g) Z0 j: R+ J! ]! v( U
原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832! O! @4 B) t' j7 o% g- k
7 o- O+ o8 J& q$ R9 }
0 K% ^! O; v% \ O |
zan
|