- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566251 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175098
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
W+ Z* b7 v) c1 _8 |& C难度中等3 x, ?) V; }+ q' c
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。. G7 [! y/ X- a4 O( m
如果数组中不存在目标值 target,返回 [-1, -1]。
% R+ A+ _8 d) O& R: J4 i, g$ L你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。9 I4 W8 [- f4 |7 q+ h o/ J G
5 e! U" s: ^6 V% O示例 1:
# q( b( e0 K3 K9 X! J1 U/ Q输入:nums = [5,7,7,8,8,10], target = 81 _6 ]' ]3 c3 e# S/ F9 K6 G+ p4 Y
输出:[3,4]6 U# ~1 l: N u {, ?% O4 |- U
示例 2:6 y! y o# I3 X; [% _3 D9 G
输入:nums = [5,7,7,8,8,10], target = 61 {3 ~0 W/ K4 v( w% j8 G
输出:[-1,-1]/ Z% [2 y+ ?5 E, J1 M% ]7 G" ^
示例 3: e3 K4 w* k+ I9 D1 R
输入:nums = [], target = 03 Q8 i8 A6 p5 m4 N6 e3 ^
输出:[-1,-1]2 n i6 P% C J7 }, e P9 U
1
* L# _& h0 f0 G& t" }2
$ k/ o0 t% j5 H) S: X ~* K35 A6 b3 ~) q( ~. v& ~
4
1 g' [9 w( U2 y. {5 U& K3 ^, W! c- Z9 g# h
6- C o+ n# ]# | I/ u) A# j2 [
7
# x. W9 p( u% Z( y' d8: G$ h# t0 a6 c9 t4 T9 D- F6 _/ R
93 {. r1 t: U! }# {2 n
提示:
# S* S$ {7 S7 ?2 v; m$ H7 ?% m+ ?6 x* z) q1 G7 P( X5 y5 x7 ?
0 <= nums.length <= 10(5)
! J* Y8 n1 _* k! g1 `-10(9) <= nums[i] <= 10(9)
& X/ ~( A! d4 H* xnums 是一个非递减数组
# J, L8 X4 J2 G% W-10(9) <= target <= 10(9)
8 ^3 J8 t! a; D- R! I( K4 ?思路/ k/ z3 `* _( `. x0 F& [& v
关键步骤,与二分查找不同
2 L5 [7 T, V' Q5 `6 Zif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
. v5 W, [ h' E Ztarget==nums[mid]时,不结束循环,继续进入
/ e3 p D% ~4 H- D0 n7 j# X9 g两个if可以同时进入,寻找界限0 |4 h' x. {& i" E1 p2 [
设置限制,防止mid-1,mid+1越界
2 |' l' C1 L! O/ M, f. r; m代码# R3 i( i2 ?! @& ^9 @, ?( v. _
class Solution {5 J1 Y: Z1 R8 x4 T" D( t' |6 D# W
public:
6 K8 f( z) p1 O! t" t* n5 M+ E/ } int left=-1,right=-1;
) I0 _7 E, y4 R9 U8 I; ` vector<int> searchRange(vector<int>& nums, int target) {& _3 b: @* \6 m5 n/ m
if(nums.size()==0) return vector<int>{-1,-1};3 n4 [$ {; e" c5 x: J
binary_search(nums,target,0,nums.size());
7 H8 {8 w9 ~' O" ?& | return vector<int>{left,right};) U: @& l7 _- _9 J B4 I, p
}
% b* y( O' _; M5 u: u1 y void binary_search(vector<int>& nums,int target,int l ,int r){/ |, l- {9 r+ e$ _" z/ H
int mid=(r-l)/2+l;
& M7 E3 p8 A) E //printf("%d-%d\n",l,r);
. S) w1 S; A- S: {# O if(target==nums[mid]){
0 i( l2 C2 O: x if(left>mid||left<0) left=mid;5 D h% r& n0 U6 h# Y$ W' m
if(right<mid||right<0) right=mid;
; F7 _" E& s2 ?1 z+ x9 w }, V4 c' ?0 D+ S$ M
if(l>=r) return;
( i: t! ~5 d+ X" n# K' ] if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1); }* s/ u2 D2 T* Q4 m/ N
if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
. d5 n4 X2 g9 U7 l! C2 f+ N' y }
. ?4 k! l+ R* [5 U- P};, [( ~; ~9 M1 W0 _$ d! ^& [
1 m' H" Z* Y" ^7 \# L' u' J: g" S————————————————" i7 A- f8 c! R' f# E
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 ~$ Y4 P. V: h* `8 m: k% L
原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488329 Y; L3 R2 r- E' q+ Z/ w
# v9 a% U2 ~0 e& M) h) y
- ^: D' N- ?2 H4 l
|
zan
|