- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569630 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176112
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
/ t3 c# ]1 ]; c2 t: m难度中等
2 [4 P; A ~1 d2 g, ?! Q给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。3 j" p0 E" w e# n* k, g
如果数组中不存在目标值 target,返回 [-1, -1]。
5 S, y: E, p9 [+ L$ i) `- u你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。& x* U4 T5 v( j7 a$ t4 U1 E
* E$ x) M, F {% ?' B6 X5 ?示例 1:& j# _3 S. C; A
输入:nums = [5,7,7,8,8,10], target = 88 Z# c H, Q/ a1 ~
输出:[3,4]
8 \+ p! t P* g: d示例 2:. s* d+ G# R% J
输入:nums = [5,7,7,8,8,10], target = 6
, d! o! ~# ^) U: C R- p& t输出:[-1,-1]
# {4 r9 _: R1 V5 o Z* s2 |5 v/ Q示例 3:$ b; p+ O9 ~, x& `3 s3 J& `" Z
输入:nums = [], target = 02 V0 R2 v6 t. _8 N/ x$ B( g
输出:[-1,-1]
: ?9 u$ r$ b3 N9 y# k0 F1: r, H7 S1 r* B3 P% m/ o3 i$ l/ l
2
1 G0 o$ s7 V X3 U% O! A( K1 ?; R30 [& S, _9 L5 w X. }+ ^8 Y/ }) Y
4
$ R ]* y& H% a0 m' d* Z6 v% U3 w' Y0 G56 A0 c ^1 r# Y( c
6( M/ L: B6 n7 Y, F
7& P$ b/ ?0 Q4 j- c6 E
8
: h6 f8 I n* ^/ s9% M* r+ x3 t; v; X
提示:4 O4 l2 D3 z, Y9 C9 Z
6 S6 G* U h, n, M H7 V' t9 N
0 <= nums.length <= 10(5)) ?7 E3 F) V0 m3 z2 ?% U# v$ l
-10(9) <= nums[i] <= 10(9)
& t# ^" ?8 ~4 O0 s% Qnums 是一个非递减数组/ |+ X" e; Z. Y7 e
-10(9) <= target <= 10(9)9 l/ \* A' P+ \7 V U. {
思路
* ?2 S ?" x' ~4 f/ O$ w关键步骤,与二分查找不同
5 t1 }& O* J7 U6 u' J9 pif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);; ~& s- g% X# H$ Z& g
target==nums[mid]时,不结束循环,继续进入3 p9 V3 p, n& R) u+ w$ }
两个if可以同时进入,寻找界限' j: s1 D# O) N v
设置限制,防止mid-1,mid+1越界* ?+ A' O; V7 b6 \: {+ [
代码+ D6 R6 l! d5 a7 J/ J o4 a
class Solution {
5 z0 s) T2 q' b3 Q9 T4 F- A. npublic:5 ^2 ]) k( Q3 \) Y6 w. ^
int left=-1,right=-1;6 R- Z3 S7 W# Y9 G* m
vector<int> searchRange(vector<int>& nums, int target) {
8 S. w. i% J* Y: x! Z) T) M/ x if(nums.size()==0) return vector<int>{-1,-1};! R& j9 e; [5 v0 d# u- M7 }
binary_search(nums,target,0,nums.size());# c6 B1 I' f0 x) g
return vector<int>{left,right};
2 m) _8 C/ {* d) R8 a8 F }0 W: d# v( n& F
void binary_search(vector<int>& nums,int target,int l ,int r){
3 \9 e# h% w9 ?" Y2 J" Q5 h int mid=(r-l)/2+l;% d8 V: x; w3 v0 L# ]
//printf("%d-%d\n",l,r);
5 k4 f0 F& _0 ?: z. o if(target==nums[mid]){
7 {7 U& Q. F$ m6 e0 W) C3 | if(left>mid||left<0) left=mid;
8 `8 F5 \& s$ q: v$ b if(right<mid||right<0) right=mid;
$ J, M' G6 d8 D- `+ t }- b8 c. X q9 e1 Q
if(l>=r) return;
0 t% z, @; _: a if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);( F/ h ~+ ^5 n. v3 ?' a
if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);/ L3 Y8 B) c8 j
}
2 h) X! N0 J. ]7 G' L- l};3 |; S5 [! f4 E/ U3 h7 m1 T0 L
4 I' @' Z: @ T) i————————————————! ], k* X& D5 D( ?
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 E& M+ v% `! g- P! q. x2 U( ^! Z
原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832
8 t- V$ @$ E- t5 {. {* i) Z# e) ]+ {" b7 O7 ~) X+ {' ?' ]8 a
1 B: z4 D9 r2 S0 l J, o1 z5 u; D |
zan
|