- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 554679 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 171777
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置3 s* _( u$ y! w5 A* `0 Y; [
难度中等" o% K8 y/ m8 v: ~5 k5 h7 j
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 Y5 S0 V* q+ D% {: \4 w! R$ I4 O
如果数组中不存在目标值 target,返回 [-1, -1]。
G1 K" L, Q/ b( L+ Q# K你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。. i, V' {3 I; [( [) @# |3 G
# @# m/ ]( W1 T. ^$ s, D; z
示例 1:, k" q& q) P9 w8 e3 ?' j
输入:nums = [5,7,7,8,8,10], target = 8$ U: J# D0 D7 _; C4 P0 Z/ x' }
输出:[3,4]& Y- L( E# Z* C
示例 2:' ^* e7 R3 ~8 d1 c$ `
输入:nums = [5,7,7,8,8,10], target = 66 N9 t% m' _+ V# _. `: m
输出:[-1,-1]9 M5 }8 z& m* N8 U# s* B
示例 3:
6 n! q S/ z7 Q) C7 a输入:nums = [], target = 0& |" Q9 ?5 H! o
输出:[-1,-1]1 O y" b: r/ a, s
10 C) s7 e/ \9 a4 G0 I9 k) D5 g8 P- ^/ W
2
/ y, }* |7 A2 `5 `' D. l0 C3
, R; I$ c$ ^: ]5 l4
& J. o! d' R; Q1 Y1 X/ U5
! s! f2 G O- @& T9 V6
( ?, s; V% c6 d: b3 S7: N6 D& j5 e" [: W8 n" z
8/ M1 D6 U2 j1 p1 J, s1 _- M
9, W( }& T( g1 L( b
提示:
. b# r) v- |1 P+ i" r0 t
_$ c- N7 d+ I0 <= nums.length <= 10(5)
) {2 {. t4 z8 p! D( p5 h9 S-10(9) <= nums[i] <= 10(9)
' w3 Z4 O3 T$ d, `8 bnums 是一个非递减数组
0 e- {7 N9 t8 S k# d! q7 ^-10(9) <= target <= 10(9)( J0 v! T2 c1 n0 b" b. r
思路
; p7 u1 T3 E- M, X关键步骤,与二分查找不同
. A0 `# @* o: u6 [+ M# xif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);5 ~$ g- T: {+ f
target==nums[mid]时,不结束循环,继续进入
3 F3 F# u+ ^8 Q) U$ `7 b$ t两个if可以同时进入,寻找界限
/ R. {( D0 g; h% e7 U" w设置限制,防止mid-1,mid+1越界+ m( y! L7 N" |: b1 p* V3 [
代码
8 l4 c+ Q, w. d9 {class Solution {
* L0 c% k. w( t/ |& P# Z- Cpublic:
" t# x, u. ], B" y- {$ [! S3 e int left=-1,right=-1;2 |# T# X+ }% d$ {- |
vector<int> searchRange(vector<int>& nums, int target) {7 i- D9 x1 ]0 r' [
if(nums.size()==0) return vector<int>{-1,-1};2 V* M) I3 H6 I" j/ h. B
binary_search(nums,target,0,nums.size());* `5 P/ i2 ?- A/ l' B, h, z; A- `
return vector<int>{left,right};
1 N ^$ l1 W- @ }
1 w$ g& o2 o7 S; G$ G void binary_search(vector<int>& nums,int target,int l ,int r){
9 i) X& z. @9 G0 F$ L5 W g int mid=(r-l)/2+l;
8 }' J& ]! \* p' g7 G. L a! K //printf("%d-%d\n",l,r);
+ q6 b) C: L5 h' l if(target==nums[mid]){
3 @1 G) j" _! g4 E1 l if(left>mid||left<0) left=mid;
& g: A' T% ]* }/ P if(right<mid||right<0) right=mid;
2 u% e; J6 {$ p0 t( ^. z" J, S }
2 r x7 p o. Z4 c( n if(l>=r) return;( N# S, a9 P/ W
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
2 M0 r* F4 d( V m3 W if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);* @" |$ n6 r# \5 X( A* |' r
}' n% E- Z8 E5 l) O1 p: W: A
};
7 n9 E* }& b6 h; M5 w& @" }3 N. m# l& [. b% `
————————————————
z# K% y2 L" M) N8 D版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 e, ~6 p5 W5 `/ `: A
原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488324 L+ }; h6 e+ X8 \' v: h
7 M$ [! d0 b3 O9 z$ e: U3 l1 { {9 O+ a6 ]0 O6 \8 d
|
zan
|