- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558442 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172905
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置+ Y1 g4 W/ L' C6 ?( d
难度中等, R' Y1 \7 ]6 M1 P5 W
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
! M0 M) k% T+ i7 u如果数组中不存在目标值 target,返回 [-1, -1]。
6 l6 P! x, _ j4 w: d& `8 Y2 ^4 A/ `你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
4 X) J- \& G6 D6 i; M- W) f- N$ \; P) k8 T+ [
示例 1:2 V; q+ S+ N. P1 y
输入:nums = [5,7,7,8,8,10], target = 8
" t9 C C% ~" {输出:[3,4]4 T4 g" M5 H6 v$ H
示例 2:+ {7 X. ]3 D% `5 h* s! A
输入:nums = [5,7,7,8,8,10], target = 6
) ^' N7 P' u: j$ p输出:[-1,-1]" L# t9 D) Z# ]$ g3 o$ V3 Z
示例 3:/ Y! k7 W$ X" K+ |% n
输入:nums = [], target = 03 F+ r& n. [4 ^* \( e$ z/ K
输出:[-1,-1]& a3 s' c3 X" ~3 K$ K0 V7 L
1
- ~; {- f# I3 d2
7 R: E& T q, f) f+ S2 |+ v35 n. g, W3 O& d& i6 w5 z/ r
44 W# L# E* o1 v) q" M2 X% |
5
% w: X% t/ G) |" \: n# `8 k: X6
- @8 O6 W; | f. |7 M, A$ z7
! u; {4 s4 _) D! s# E4 G8
8 C7 B/ a" H5 E' ^4 H' s9
o9 n. M+ w# l提示:. m3 O" ^1 d3 A8 k' a# u
- f! q% \2 x1 Z# U9 s1 J
0 <= nums.length <= 10(5)2 ^: ]( s; A( b7 x* b1 p
-10(9) <= nums[i] <= 10(9)
) u: {$ m U; |9 c7 enums 是一个非递减数组7 F: t6 m1 p) `9 I# J( ]7 ?
-10(9) <= target <= 10(9)
+ @7 W9 ~6 T& m思路( ~1 w# o- Q. t- {: s4 ?4 ~% A
关键步骤,与二分查找不同
& K6 T; R+ v: q- h8 `3 ?8 L3 N( cif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);; v) R W& t; r! }
target==nums[mid]时,不结束循环,继续进入
& y3 W( S: }9 O4 m两个if可以同时进入,寻找界限' k" A6 W- v6 }: O. T# ^* t- b
设置限制,防止mid-1,mid+1越界: d @. p, n. u
代码
% q* l- Y J8 [0 z- z/ F7 _5 T Dclass Solution {
3 l, e: X; {; o! s: wpublic:
9 G$ R& b9 Y& @0 {, _7 p int left=-1,right=-1;
6 ]6 L2 Y+ `$ C, D vector<int> searchRange(vector<int>& nums, int target) {: d, l+ e7 @5 Y
if(nums.size()==0) return vector<int>{-1,-1}; E0 T7 u3 ~- @) ~' }
binary_search(nums,target,0,nums.size());& L' c( K" E' F4 U+ _
return vector<int>{left,right};. a- \6 p. X6 g \# E3 p
}
! e# k B, @5 t2 D: S$ ~ void binary_search(vector<int>& nums,int target,int l ,int r){7 d2 ]0 u5 C4 Y* G; t1 [# z
int mid=(r-l)/2+l;
: `0 ~7 E# J9 Q1 @8 w' |- { //printf("%d-%d\n",l,r);* s1 N! `' C+ L) h* j* ~0 B
if(target==nums[mid]){, V$ U. C& B8 l/ @, t2 h2 }
if(left>mid||left<0) left=mid;9 E- {5 [: X0 Q; a7 [' q! i
if(right<mid||right<0) right=mid;1 y4 \: r7 B! f
} N7 n. b+ k: ~& {6 m: o3 u
if(l>=r) return;4 C- h# f5 H& k7 `+ X/ U" c
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
" _9 i0 Y' N7 d( f5 A6 X8 A3 ^ if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
# G3 g9 d( ^. d& K+ ]" N7 y! V }. ]& E: H! h3 i2 l: J% V: h
};* f1 r% H4 C8 i0 Z& w F, s
" n. a1 x5 E. I( t T————————————————
) C' [: i2 K& n) k4 E, V: o版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. h, q7 g- k' S. A6 y8 b1 `
原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832; O0 a8 J5 R; b: a( L) [2 H! k# R8 v
- k6 X( g! T* s% X+ q* U
2 D0 K/ B8 ]! x8 S
|
zan
|