- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 567244 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175396
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
0 J3 C1 x7 n) {3 B6 `5 E难度中等
% z7 X) R: J' C% p3 p! i' @. _给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
0 K4 Z' G; n' r如果数组中不存在目标值 target,返回 [-1, -1]。
' l% f6 c2 x+ d3 R! e- N+ e9 T. B你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。) l4 l. O; ?: L6 F
! o; B- ^ p, H( g/ o
示例 1:* A1 R6 \$ _; B; z
输入:nums = [5,7,7,8,8,10], target = 8) D9 Y5 L5 w s# T6 c* F1 b4 U( Q
输出:[3,4]# P4 T: g! \1 B4 B9 z% I5 p
示例 2:: j& k! q# M4 m3 i1 _9 ]7 Q
输入:nums = [5,7,7,8,8,10], target = 6/ G& K) }) Z, l; m$ g3 ^
输出:[-1,-1]/ F7 ^$ u, Z- Q: H W
示例 3: J/ G* C5 M2 |; v! j
输入:nums = [], target = 0; ^! U, z. K7 u! a
输出:[-1,-1]
! [' h6 q2 D t' X' e# I- @ I1
8 z8 W H- L' @0 Z- }22 J" F" G( Y: N {2 G6 T7 c
3' s* ^7 g# g3 D6 g
4
" h! s) Z- Z c5 @! a5
, K W* B# H8 B+ t; T7 T9 i6
% v, v% J# s9 y$ C9 x I76 G N+ s' c: o' Y% j6 H# i! N
8
" l5 t% ?$ G& R; n- D3 f/ M9
( j$ x) _3 J* R提示:7 [! f0 N$ U* k d. Q8 Q: ?# g
$ Z- M5 j7 A' H8 ?, Y( ]0 <= nums.length <= 10(5)
5 g! m8 L7 n' x9 g0 H% M-10(9) <= nums[i] <= 10(9)- h0 L& c* M( h$ O/ V% @4 ]4 m
nums 是一个非递减数组
; T: H0 H8 e. m1 U5 F6 L( V( k5 {-10(9) <= target <= 10(9)
+ U A; P! o; X- C" |; x9 i: q$ d思路
1 Z- v; l# A/ o2 g0 s5 k关键步骤,与二分查找不同" M& X5 G0 z" e: @
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);9 a% d# G: u' D7 U! Q5 T' ~ e
target==nums[mid]时,不结束循环,继续进入2 k6 l: o7 {8 v/ ~& E% \- o
两个if可以同时进入,寻找界限
& p9 [, v0 j; z6 Q4 C- W5 P设置限制,防止mid-1,mid+1越界
# M+ y$ |! u; b代码
1 }5 A A7 w/ e: R. v( g( bclass Solution {
/ n7 k: \' e4 ]3 ypublic:
' R5 g# N7 l4 ]: F9 e) D0 u5 J/ e int left=-1,right=-1;2 ^& A$ p F5 Z# k
vector<int> searchRange(vector<int>& nums, int target) {
7 Q( S, i" a5 \& M" C# z) \ if(nums.size()==0) return vector<int>{-1,-1};- v5 { ]9 e. N5 }8 W
binary_search(nums,target,0,nums.size());2 V* f! \' j" [+ t) E
return vector<int>{left,right};# L) @8 _2 M) h* f" W m* @
}/ U# O) Y8 N, @# a- s! _# Y
void binary_search(vector<int>& nums,int target,int l ,int r){! Y8 L3 S7 V+ z) _( k
int mid=(r-l)/2+l;. S7 t) ]% ]% a: h4 j. ]7 [
//printf("%d-%d\n",l,r);6 a l4 O- y0 R' n; }: j
if(target==nums[mid]){$ x2 U* O6 V" g& Y/ K! O" n+ T
if(left>mid||left<0) left=mid;
3 V/ b$ t, Z2 _5 i4 S1 [' L if(right<mid||right<0) right=mid;
. Z) {& E# C- {: h9 @ H }3 t6 y6 |: z' R. H6 \
if(l>=r) return;/ w+ X% w9 \4 d2 Q$ O* C } M
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);$ e9 a, k- q/ e+ a9 k% g: L
if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
2 ^8 |0 u/ n3 M$ k& O7 v }% G6 c) m& K. O" p2 a
};6 l+ A2 O9 |1 P7 R7 I8 [
( u( Y3 t) B$ I
————————————————- n5 \, Q" J8 _ Q, @1 r
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. r( X5 k/ C z9 y6 W原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
, a& G. \! W* S: D# m5 g0 j
/ Z* d/ l5 y6 y- o7 W" E% D
5 I5 V5 B6 l; _( ?; v, n |
zan
|