- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563412 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174246
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
8 |, i& K; u% D' }* N3 P( G难度中等
9 y- {5 @5 w9 J5 ^给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
1 I: q# y# ]4 |. W如果数组中不存在目标值 target,返回 [-1, -1]。
" G* f$ h. Q) O+ y' `& _你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
* f. q+ H; E# R- I7 c2 `. D/ ?9 `* ^
示例 1:# F/ @: b9 B, e( C, A* |
输入:nums = [5,7,7,8,8,10], target = 89 Y4 U( J5 b& l5 |
输出:[3,4]
* ^ `2 ^, z1 _5 a示例 2:) a3 t! s! m( @
输入:nums = [5,7,7,8,8,10], target = 61 i7 y+ g$ ^8 Q' x( o
输出:[-1,-1]& Y' x7 m) H X- e
示例 3:9 j# e( Z' g5 m! d
输入:nums = [], target = 09 D) y v! D! {2 Q, Q* Y4 c6 j+ i
输出:[-1,-1]
9 T1 R9 [) p* R/ c6 w4 u; K8 x" j$ S1/ ]* p) E& L2 L" A1 E
2
7 D0 ]+ @5 r V, E3 H7 ~/ @3
9 h! e) Y, n* A: k m+ l- @5 ?4
3 F( f; @0 G2 n5
; p, l% X G. L8 ]) P6
- I$ T% E4 d" g, h74 W" h8 I, x, X! e5 d
8
2 F% e2 h2 y; s$ [1 V$ `* z, F9
) c3 L5 A6 u5 }/ Q提示:
2 y( ~/ p$ Y, o0 Y( [! H# a0 M* ^- i3 e+ l) E
0 <= nums.length <= 10(5)
# u5 @$ t5 u1 ~9 \8 c" V-10(9) <= nums[i] <= 10(9); Q! r- j2 U" ^+ T1 r5 w
nums 是一个非递减数组' y- D) w* }( S8 V3 a
-10(9) <= target <= 10(9)
, R7 P+ @/ D* d: C. j思路" n; T* Z7 Y! [# c
关键步骤,与二分查找不同8 i! O/ w, J& T$ I" {6 z
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
# J6 B$ w ~- z& Gtarget==nums[mid]时,不结束循环,继续进入
( o5 `6 ?" S% x7 Z+ H( T, Z两个if可以同时进入,寻找界限
' r3 Q' d0 R( v1 D! `5 @设置限制,防止mid-1,mid+1越界
/ }9 Y' B7 T/ [8 a3 w3 B代码8 Y, t q: k4 C% J. S
class Solution {) c( ^' ` s$ l% V/ y7 o" ]8 l
public:
$ V# p& c6 L- z3 w1 d2 s int left=-1,right=-1;
& t, S( U R- D5 v vector<int> searchRange(vector<int>& nums, int target) {0 S& I/ f. q$ \* y U& B9 U1 g
if(nums.size()==0) return vector<int>{-1,-1};: H& a; z! {6 n6 d$ E; f+ e8 p
binary_search(nums,target,0,nums.size()); f, m( \+ j `7 ~% E3 Q9 K
return vector<int>{left,right};
( b0 ?) Z" f3 n; x T& W0 s1 k }
; _" `3 w0 L+ F void binary_search(vector<int>& nums,int target,int l ,int r){
) R& v5 @$ U: w- M int mid=(r-l)/2+l;
% N5 s H. f0 u3 D8 J5 i, K //printf("%d-%d\n",l,r);0 p+ M% {9 E* Y: Y7 W
if(target==nums[mid]){: } ?: h5 A. ^2 P" N+ N
if(left>mid||left<0) left=mid;/ B6 P) j+ O+ i. a
if(right<mid||right<0) right=mid;9 w. S+ F R/ N% Q
}0 Y' R' J8 p& ]. u4 |* C/ V
if(l>=r) return;
7 u- i9 t6 q v3 ~. F V$ E8 g if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
* I/ i) t6 T' s* z if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
$ n! l, s$ i$ l* ?1 ~ }. M* X9 G+ Z6 P# J& a" E0 C# K
};( {( ~8 E5 y/ d- W' @% q
+ g! M' Z! D P5 b. |————————————————9 c7 e7 ]! X& k- X$ B
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 _, \+ @& j: f原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488326 C3 h# Z- K' U8 P5 w8 ]
7 _, {: P8 H7 }; P& c' e
% o- A4 }1 G! ^& u4 D |
zan
|