- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565645 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174916
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置3 g7 f4 `0 [8 g1 r* W0 _" c; I
难度中等& U$ b3 R Q. Z/ }8 @# I( b" t5 @
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
& u- H5 c6 V6 I6 L; R如果数组中不存在目标值 target,返回 [-1, -1]。9 E/ {0 Z, J$ d. ]5 W
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。( p; G, R7 v, `2 x
; ^. }8 s% b X; \1 W8 M
示例 1:9 c+ N; u+ @; H: F+ \
输入:nums = [5,7,7,8,8,10], target = 8
, j& |2 T4 d& X- i! h; s输出:[3,4]$ H7 o6 @/ Z3 O3 E
示例 2:
# ?" i$ F0 g% S7 f- h% B0 H6 a* P! M输入:nums = [5,7,7,8,8,10], target = 6
: r8 X2 b; D, w* Y输出:[-1,-1]
6 b* ]6 ~* i( ]4 B2 y示例 3:3 ^. ?2 U/ y: s
输入:nums = [], target = 08 A# G$ s* U0 q0 F/ {$ t: O
输出:[-1,-1]
* C. f# S I& X1! v) |. E0 `1 w
2/ Y6 W5 m* w, l8 {" Z3 o) F
36 n' S/ g' Y" q8 V' {
4
( O" O$ B- o" _5/ A- q& R$ |1 u! @ X% ?9 ]8 G' i
6' t2 W a, g/ }: d h8 f
7- w% v$ F; E* E! ^9 h. E1 R/ j2 e
8) f5 W, C4 J! y# b( t! |3 A9 J
9
: n6 z8 p3 `1 o( A- [0 @提示:# T& ]! W# H; k
9 U" u8 D @: l5 E
0 <= nums.length <= 10(5)1 F3 g; Z- f9 d% T
-10(9) <= nums[i] <= 10(9)" r; o" L+ c& j5 @
nums 是一个非递减数组- i8 F+ \/ E: Y2 D
-10(9) <= target <= 10(9)
' n1 H% A1 Z8 S+ U) A H思路3 Y2 l! O2 v+ ~5 N6 L J/ S: F
关键步骤,与二分查找不同
+ l; k0 F. \& x nif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1); B. N" B* x7 V9 x" L6 s
target==nums[mid]时,不结束循环,继续进入
. F; n( {8 W- [' u两个if可以同时进入,寻找界限: ] J( Y1 J ]$ G3 V. ~5 W: x9 x
设置限制,防止mid-1,mid+1越界
8 V w3 b- Z% v* H代码
1 v$ Z# G9 K% P) T- I# Wclass Solution {
% v4 E9 q8 P& P$ o _3 A+ P9 Bpublic:
1 V8 \, I: {4 D: V" _0 U9 {7 E int left=-1,right=-1;" r+ h* S. k* _2 B
vector<int> searchRange(vector<int>& nums, int target) {' e/ M C- U* ^; o6 o, X( l
if(nums.size()==0) return vector<int>{-1,-1};4 C9 Z/ N, u: i0 y' w# T
binary_search(nums,target,0,nums.size());
$ h% Z1 d) C+ c! f/ K5 T return vector<int>{left,right};
' Q/ @8 e6 K6 D& i9 y2 b. q }
+ q. c% u0 T% L+ x, Q% Q void binary_search(vector<int>& nums,int target,int l ,int r){* s5 V3 ^6 W3 T0 J7 S1 r$ s
int mid=(r-l)/2+l;2 G, k) w2 w" A7 O, P/ Y c
//printf("%d-%d\n",l,r);7 l' B$ ^2 K0 Y, ]8 N
if(target==nums[mid]){/ z8 ]& k) Y' H/ @1 P, N
if(left>mid||left<0) left=mid;
1 D5 d% m: T* G8 C if(right<mid||right<0) right=mid;! M0 U2 z8 s1 R' N# Y; ?
}" C4 r. i, {8 V1 z' d. b
if(l>=r) return;" i3 a8 e" ~% f
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
& `4 O" R& H4 g# w: y if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
; u% M) M( F" m6 | }
9 \. i0 a4 d# P+ t: W};
; m) Q* t8 ?- D6 X
" v7 ]2 }, o" ]————————————————: i1 w; U4 ?; u$ A/ f2 F$ W; I: `
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ I" h' D3 }) R1 j; l* ~原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
0 j _* Z+ @1 b L; ^6 _1 S
( d' r. b& L$ c3 J
% F% J) a5 c7 x' \1 Y5 J" A |
zan
|