- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565167 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174773
- 相册
- 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 e/ {; V, S4 L1 O* \( y难度中等5 n% u( e+ _) l% x: @% Y5 c
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
# s" A. S! C8 n/ ]9 `! ~如果数组中不存在目标值 target,返回 [-1, -1]。
2 C0 V9 A( f" C你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。" i7 d Q# u6 R7 _
e8 k; N* ^4 e8 _4 m( p示例 1:
) L! L0 m5 ~8 q" e: C' y输入:nums = [5,7,7,8,8,10], target = 8
6 ]4 t8 J8 V5 p/ H- B2 I输出:[3,4]
) m9 o$ ]0 N4 @9 O示例 2:
: P) A: g/ Z+ M0 c输入:nums = [5,7,7,8,8,10], target = 6
) y/ O+ @' e' H$ f( x% s% ] m" a输出:[-1,-1]
" A/ H# A$ J+ {9 {+ C示例 3:
~% {. B+ }- e- M" Y6 P/ y! z输入:nums = [], target = 09 ~& N' R, d4 I% P# P
输出:[-1,-1]
, _/ \8 I) ?+ S- R2 i7 P12 Y' H0 h, S5 b) t9 [
2, k' @4 {- J$ l& T* o
3
* ]7 F/ R% F. s3 o/ B0 {% G4/ b, B6 A; {+ b& ?5 a$ L$ X7 ?8 ^
5( U- V3 O' X3 m8 I) ^
6& q: J2 F- h* v' X
7) X& I% l+ Y/ u- A1 x! J" W
81 k9 K2 R4 C9 ?( n. c, j* g! m
9
8 f b1 `8 q% n; e8 ?) P提示:8 B' P( p7 u/ `& C/ `
1 t3 B; d6 x4 Z& g& N0 M5 V
0 <= nums.length <= 10(5)% w- Y* _# ]! ?% W- k
-10(9) <= nums[i] <= 10(9)- U' Z3 r$ r) `3 X6 p' g
nums 是一个非递减数组3 ~' y0 L5 ]% G; ^! S. S" A( l
-10(9) <= target <= 10(9)3 q7 p0 C0 Y3 D! [4 Z8 Q
思路- `) r) J2 m' U j; `
关键步骤,与二分查找不同7 d, D4 d) n1 o! p
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
3 }: L0 Z1 q' ^) ^, d$ o4 Q9 E/ gtarget==nums[mid]时,不结束循环,继续进入
6 d' J3 k' D" c两个if可以同时进入,寻找界限
, k& I! S. _; b# x4 N% |) {$ i设置限制,防止mid-1,mid+1越界
( T# P) X9 C F+ O6 b4 v代码7 T) _1 q# c, z8 z& i
class Solution { `, L7 m. |6 P- I
public:
5 L2 f/ w& V, h/ s' y Q$ g; K+ L int left=-1,right=-1;
9 v! V% c5 m( X1 O' G+ h! e vector<int> searchRange(vector<int>& nums, int target) {# C# `: Q& V \1 \. @
if(nums.size()==0) return vector<int>{-1,-1};
* p( T4 C6 ]3 y8 e6 f binary_search(nums,target,0,nums.size());
$ P+ u7 W7 [" o# o return vector<int>{left,right};
, \8 C' t* c1 u; b: j4 E3 v- [ }
, ~5 c3 T- O7 H2 } void binary_search(vector<int>& nums,int target,int l ,int r){
- d, p8 S* }* F1 M; w. p int mid=(r-l)/2+l;
. E1 s% V" |- i5 p //printf("%d-%d\n",l,r);
4 t& I; O' u4 B if(target==nums[mid]){
! x- X# F5 V! a5 |4 }2 ~ if(left>mid||left<0) left=mid;
! n U6 l& V. a; C if(right<mid||right<0) right=mid;
9 O- ~& s! R+ F( C! Z S }
; `/ l) d. \" O4 H& U) P1 C; W if(l>=r) return;/ R, C- i: i1 y4 K
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
6 {3 m @. y/ }/ `6 w- Y+ D+ @* K if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
3 |$ @$ y& q/ ~/ L7 |9 M }
6 v' B$ e- i. {0 V6 l& {};
, g+ n& z$ R; f1 I& ]9 [) u V! T3 ^- m5 r
————————————————
6 y, X4 V5 s' K/ z' t3 }% |! k9 _版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 v0 n' x0 T+ u; F9 D8 j- s原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
, `: n$ w8 S: j3 u7 c Y% j4 q7 @0 N7 J, W6 ?1 b
0 F0 X6 E, a: D8 A |
zan
|