- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564675 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174625
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
: I4 d3 z7 t, i% x5 r I难度中等
/ L1 l. @+ ?5 }给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
2 r+ \: I0 Q/ q3 J6 s R如果数组中不存在目标值 target,返回 [-1, -1]。
( T6 V3 @2 u) P你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
9 y; @' r: l, L" `' g6 y; D. H* v( C. s" w9 e. y; t
示例 1:
1 m0 X1 ]" I5 r+ c% V) D; _$ I输入:nums = [5,7,7,8,8,10], target = 8
1 }7 f3 {! b+ f+ {: k" H% h输出:[3,4]& t- I+ o. U5 P" [% f8 S" @
示例 2:- k8 y# |( S3 T5 O, O" j, ~" Y9 ~
输入:nums = [5,7,7,8,8,10], target = 6% R0 R) S4 t0 n0 @( q
输出:[-1,-1]
% N0 |4 F' e9 V+ H. t& F: r( R示例 3:
, G8 I: O% _( W' S+ K; n输入:nums = [], target = 0
# i0 y0 }+ n( e+ T! ]4 G" c输出:[-1,-1]) z) D9 i$ M4 e8 D8 e3 f
1
8 f8 b" d. L9 k3 A' F, K2. t6 g% m( v) ]1 _5 @
3
0 X- T3 r0 {+ c- o% @' }4
" K+ ?2 _1 {" h; _+ H3 _5. A8 r+ Q' F* X$ R. V( w
6& W8 _# k9 [$ W7 d4 ~
77 D7 G: r- Z" y H6 f: b) }
8
& u6 O) s& s; O8 r1 K9# E' X" g; D5 c8 a
提示:8 T- w/ D Q0 t _2 l6 O/ j
, V) K% M. s6 s; U; V
0 <= nums.length <= 10(5)+ v" ~1 i! j7 k) I3 c
-10(9) <= nums[i] <= 10(9)
/ N0 R6 J% ?/ u' Tnums 是一个非递减数组5 G5 M+ D% H* P8 `5 w
-10(9) <= target <= 10(9)
1 |1 T, \; m4 A5 A# @2 [1 r6 x思路* b. L- l2 N2 H" b
关键步骤,与二分查找不同
: y) U5 p# k" R; \% i0 e3 |if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);0 I1 P- D, L# {9 M+ m
target==nums[mid]时,不结束循环,继续进入
& f' q8 i4 n! Z$ o5 H4 h+ }两个if可以同时进入,寻找界限2 t# d# j: Z5 R8 n2 B$ t
设置限制,防止mid-1,mid+1越界
0 {6 @! ?/ K+ X$ ]# x代码
, {( N8 e7 u5 u0 m* |4 h+ aclass Solution {
7 x! f, S$ z3 Ypublic:
* J( p' \8 J. t7 U, _2 ]( I' X \ int left=-1,right=-1;
! K, y. ?! j) v3 l vector<int> searchRange(vector<int>& nums, int target) {
) K5 p0 e( J' t3 Z. x if(nums.size()==0) return vector<int>{-1,-1};
9 ?; c" |: k" U* ? G: |: u# E binary_search(nums,target,0,nums.size());5 E4 n. v9 p- O
return vector<int>{left,right};
9 h7 Z& z% p' e }
) E. F% I5 Y; W4 Y! J void binary_search(vector<int>& nums,int target,int l ,int r){9 N" ?6 L- N/ @ h z
int mid=(r-l)/2+l;
$ ]/ u, L G2 u6 t3 u5 Q //printf("%d-%d\n",l,r);0 Z2 D$ u: {- y$ K1 J& K
if(target==nums[mid]){
+ ~; b8 A4 n2 x6 C if(left>mid||left<0) left=mid;
+ h% U9 r$ m" p5 a3 G* V( ]$ `2 E- s if(right<mid||right<0) right=mid;! _' A7 \4 H: R! {1 O* [. ~
}; O' v4 S' u. J0 b) E$ Z
if(l>=r) return;6 D3 U) w8 s( \# R
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
0 h0 M/ w9 d% w9 y4 R$ r+ f: K$ J if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);* \ }7 } i/ n5 f+ U* a9 t; `
}; p$ W: l l5 @: O
};
& G4 u4 v9 X, O0 [0 a$ P V6 T- y: A( N& j' w* t, m
————————————————
7 P. k! f; g- v' L版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 i1 l1 l. i/ N; S. X; j
原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832& ]8 g) n$ ~/ b) s# I) p q
: D: Z o4 ?$ p+ I! j& Z
" Q3 Y" ^/ E/ ^4 a& o
|
zan
|