- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558436 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172904
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
$ H U' u- N7 {4 o: i难度中等
% I. q# u! [8 ]' I给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。& V6 m5 k0 }7 j
如果数组中不存在目标值 target,返回 [-1, -1]。
6 C! b& R f# p你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
' c0 z" C* P( S" E+ i1 U
0 P! q- d& l% o$ @% i2 X示例 1:
& a! A) }/ ]" u9 I. w& x输入:nums = [5,7,7,8,8,10], target = 8, T* u; O: B3 J$ _8 p% U; F
输出:[3,4]
" S- t; ?1 k6 \6 }' g0 ^示例 2:/ g8 G. F$ r: B7 J9 ` C3 F: S
输入:nums = [5,7,7,8,8,10], target = 63 P. C( s( l# i- t% _
输出:[-1,-1], }3 h( Y" a' y5 V, L; H
示例 3: z( p+ r' g5 @1 i. k2 ^
输入:nums = [], target = 0( X ~8 E( r, T& E( \1 K5 ~
输出:[-1,-1]
% c! @' d9 H8 J" k. `4 U! {- \1
/ |: l8 g0 x% }8 C20 M, c/ [! S$ `+ S$ ]$ \/ e
3
' [8 D3 a# g$ e9 l! [0 k46 s( `1 S U3 I2 h' {7 q6 B
5; ]' a: X' J6 }2 {0 ~- p
6
2 j6 r" j6 |- e, J7
3 {7 q, b4 q* q6 A& J# d8; @% H0 D6 ?( u$ P
9" j/ Y0 M& `2 t& t
提示:* }0 h& N' E5 v$ P4 f( o
+ z, |% m1 U5 n4 M/ T7 U' f
0 <= nums.length <= 10(5)- R/ w0 a2 |+ u+ [) i
-10(9) <= nums[i] <= 10(9)
- G1 v4 p2 z* ^% a7 H; Knums 是一个非递减数组' [1 F, K8 | ^" U k
-10(9) <= target <= 10(9)" L; ?$ {- a9 r G5 S
思路
" M3 G/ E. ?( F1 M) q7 ^关键步骤,与二分查找不同
) F k* D- q: e# y5 r/ sif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);( ?' c& A% [# P3 _* k- ~
target==nums[mid]时,不结束循环,继续进入0 \- h3 \; e- l7 ?% e
两个if可以同时进入,寻找界限
7 }9 Y2 K% Y d- ~5 s7 y设置限制,防止mid-1,mid+1越界1 G4 C3 o- K, Y! T4 Q
代码
4 K3 ~' i; h. h0 jclass Solution {. Z: a/ Y% c8 R/ ]
public:: q& W0 ]' V+ `) C0 K l* {9 @# ~! g
int left=-1,right=-1;
5 p+ I, j! N* q9 d6 A/ E vector<int> searchRange(vector<int>& nums, int target) {
; E4 K: g: @- K$ L- }, h if(nums.size()==0) return vector<int>{-1,-1};+ o/ m/ x, S+ V! s) R
binary_search(nums,target,0,nums.size());* Y% A ]% `5 V5 b" r! E
return vector<int>{left,right};5 V8 z0 Q1 r0 R+ }. t) Y
}8 h3 f* P8 ] ?, ^/ \# a& t
void binary_search(vector<int>& nums,int target,int l ,int r){7 J% F5 h4 v8 \9 A6 ]3 \5 q3 M
int mid=(r-l)/2+l;
# V3 m+ f3 ?- j2 i( B //printf("%d-%d\n",l,r);1 U$ @4 t! q. |& `, Y$ c
if(target==nums[mid]){- l( u: C" W4 W& [3 s# `
if(left>mid||left<0) left=mid;+ a( ^# j, T; Y+ U
if(right<mid||right<0) right=mid;. X$ n, U. `- }3 |" ^5 k! w0 T' y
}' X% `4 H3 j0 B. k
if(l>=r) return;: M8 W2 M2 y6 V8 [
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);* E3 d% H/ r* m1 D) H+ _' Y
if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);' H, g) U7 C% G
}
7 e/ q$ Q$ K; m9 G! V* B* b};
7 ^4 w$ k' i) i6 v# ~
$ x, K6 c" S: x# H( l————————————————
; \# E) B! e& ~1 l/ I& A版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 l9 u( I2 l4 ^0 q
原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488327 [# u' _8 W7 f. x0 M
9 r1 a+ J5 x6 A$ l9 K
9 J9 ?. T8 D% q% ^* g |
zan
|